题目
如下函数是否存在问题?如果存在问题如何修改?同时简要阐述涉及的相关概念。
char *GetString(void)
{
char str[] = "hello"; //开辟一个能连续存放6个字符的数组,将“hello”字符串常量拷贝到数组中
return str; //返回数组的起始地址
}
简单几行代码,一眼就可以看出:这是一个C语言返回数组的问题。
直接使用上述代码运行的话,相信你会看到下面这句警告:
warning: function returns address of local variable
意思就是说,函数返回的是局部变量的地址!那我们都知道,局部变量的内存在函数结束后会被释放掉,所以上述代码返回的数组起始地址也没有意义了,因为即使你给了我地址,我也找不到地址原本指向的东西了。
那么我们应该怎么做才能确保程序正常运行呢?我在网上看到有以下几种解决方式,我们一一验证一下:
1.使用全局变量;
2.使用静态局部变量;
3.在函数内动态分配内存;
4.在函数调用参数中传入数组地址;
1.使用全局变量
#include <stdio.h>
char str[] = "hello"; //全局变量
char * GetString(void)
{
return str;
}
int main()
{
char *string = GetString();
printf("%s", string);
return 0;
}
使用全局变量的方式是不是我上面写的那样我也不是很清楚,不过经验证该代码可行。
2.使用静态局部变量
#include <stdio.h>
char * GetString(void)
{
static char str[] = "hello"; //静态局部变量
return str;
}
int main()
{
char *string = GetString();
printf("%s", string);
return 0;
}
经验证,该方法可行。
3.在函数内动态分配内存
#include <stdio.h>
char * GetString(void)
{
char *str = (char*)malloc(sizeof("hello")); //动态数组的内存分配
str = "hello";
return str;
}
int main()
{
char *string = GetString();
printf("%s", string);
return 0;
}
这种其实就是用指针传递数组,经验证可行。
4.在函数调用参数中传入数组地址
#include <stdio.h>
char * GetString(char *str)
{
return str;
}
int main()
{
char *string = GetString("hello");
printf("%s", string);
return 0;
}
这种方式我感觉是嵌入式开发比较常用的方法了,经验证可行!
转载:https://blog.csdn.net/qq_41285788/article/details/102488454
查看评论