vlambda博客
学习文章列表

C语言 - 返回一个数组

题目

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

 
   
   
 
  1. char *GetString(void)

  2. {

  3. char str[] = "hello"; //开辟一个能连续存放6个字符的数组,将“hello”字符串常量拷贝到数组中

  4. }

简单几行代码,一眼就可以看出:这是一个C语言返回数组的问题。
直接使用上述代码运行的话,相信你会看到下面这句警告:

 
   
   
 
  1. warning: function returns address of local variable

1.使用全局变量

 
   
   
 
  1. #include <stdio.h>


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


  3. char * GetString(void)

  4. {

  5. return str;

  6. }


  7. int main()

  8. {

  9. char *string = GetString();

  10. printf("%s", string);

  11. return 0;

  12. }

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

2.使用静态局部变量

 
   
   
 
  1. #include <stdio.h>


  2. char * GetString(void)

  3. {

  4. static char str[] = "hello"; //静态局部变量

  5. return str;

  6. }


  7. int main()

  8. {

  9. char *string = GetString();

  10. printf("%s", string);

  11. return 0;

  12. }

经验证,该方法可行。

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

 
   
   
 
  1. #include <stdio.h>


  2. char * GetString(void)

  3. {


  4. char *str = (char*)malloc(sizeof("hello")); //动态数组的内存分配

  5. str = "hello";

  6. return str;

  7. }


  8. int main()

  9. {

  10. char *string = GetString();

  11. printf("%s", string);

  12. return 0;

  13. }

这种其实就是用指针传递数组,经验证可行。

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

 
   
   
 
  1. #include <stdio.h>


  2. char * GetString(char *str)

  3. {

  4. return str;

  5. }


  6. int main()

  7. {

  8. char *string = GetString("hello");

  9. printf("%s", string);

  10. return 0;

  11. }

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