C语言 - 函数返回一个数组

题目

如下函数是否存在问题?如果存在问题如何修改?同时简要阐述涉及的相关概念。

1
2
3
4
5
char *GetString(void)
{
char str[] = "hello"; //开辟一个能连续存放6个字符的数组,将“hello”字符串常量拷贝到数组中
return str; //返回数组的起始地址
}

简单几行代码,一眼就可以看出:这是一个C语言返回数组的问题。

直接使用上述代码运行的话,相信你会看到下面这句警告:

1
warning: function returns address of local variable

意思就是说,函数返回的是局部变量的地址!那我们都知道,局部变量的内存在函数结束后会被释放掉,所以上述代码返回的数组起始地址也没有意义了,因为即使你给了我地址,我也找不到地址原本指向的东西了。

那么我们应该怎么做才能确保程序正常运行呢?我在网上看到有以下几种解决方式,我们一一验证一下:

1.使用全局变量;

2.使用静态局部变量;

3.在函数内动态分配内存;

4.在函数调用参数中传入数组地址;

1.使用全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

char str[] = "hello"; //全局变量

char * GetString(void)
{
return str;
}

int main()
{
char *string = GetString();
printf("%s", string);
return 0;
}

使用全局变量的方式是不是我上面写的那样我也不是很清楚,不过经验证该代码可行。

2.使用静态局部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

char * GetString(void)
{
static char str[] = "hello"; //静态局部变量
return str;
}

int main()
{
char *string = GetString();
printf("%s", string);
return 0;
}

经验证,该方法可行。

3.在函数内动态分配内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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.在函数调用参数中传入数组地址

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

char * GetString(char *str)
{
return str;
}

int main()
{
char *string = GetString("hello");
printf("%s", string);
return 0;
}

这种方式我感觉是嵌入式开发比较常用的方法了,经验证可行!