【问题标题】:why cannot pass an array created inside a function to a pointer? [duplicate]为什么不能将在函数内部创建的数组传递给指针? [复制]
【发布时间】:2015-05-22 18:32:04
【问题描述】:

getLine 返回存储标准输入字符的数组。我尝试打印出数组中的字符串,只得到一些其他字符,而不是输入。函数有什么问题?

char *file_name;

file_name = getLine("enter the file name");
printf("%s\n", file_name);

char *getLine(char *question){
    printf("%s\n", question);
    char c, answer[100];
    int i = 0;
    c = getchar();
    while (c != '\n'){
        answer[i++] = c;
        c = getchar();

    }
    answer[i] = '\0';
    return answer;

}

【问题讨论】:

标签: c arrays


【解决方案1】:

answer 是一个自动局部变量,一旦函数返回就不再存在,因此指向它的指针将失效。永远不要返回指向自动局部变量的指针。

可以返回指向static局部变量的指针

static char answer[100];  

或者你可以使用动态分配

char *answer = malloc(100);

【讨论】:

  • 除了传递一个外部数组之外,还有其他方法可以获取数组答案的值吗?
  • @PMH;更新了答案。
【解决方案2】:

函数可以返回char *,但不能返回 C 中的数组。

answer 是函数 getLine() 的局部变量,返回局部变量地址会导致未定义的行为

char *getLine(char *question)
{
   char *answer = malloc(100);
   //Perform your stuff here
   return answer;//This is valid because the memory is on heap
}

【讨论】:

    【解决方案3】:

    问题:

    {
       char c, answer[100];
       //code
       return answer;       <--- Here
    }
    

    answergetLine() 的本地,具有自动存储功能。一旦getLine() 函数执行完毕,answer 就不存在了。因此,您可能不会返回局部变量的地址。

    故事的寓意:启用编译器警告并注意它们。

    解决方法:

    要实现你想要的,你必须要么

    • answer定义为指针并使用malloc()/calloc()动态分配内存。动态分配的内存具有全局范围。

    • answer 数组定义为static

    推荐第一种方法(也是我个人的最爱)。使用完毕后记下free() 分配的内存以避免内存泄漏。

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2017-03-28
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多