为什么不能将函数内部创建的数组传递给指针?

时间:2015-03-19 15:02:32

标签: c arrays

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;

}

3 个答案:

答案 0 :(得分:7)

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

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

static char answer[100];  

或者您可以使用动态分配

char *answer = malloc(100);

答案 1 :(得分:2)

<强>问题:

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

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

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

解决方法:

要达到你想要的目标,你必须

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

  • answer数组定义为static

建议采用第一种方法(我个人也喜欢)。完成后,请记下free()已分配的内存,以避免内存泄漏。

答案 2 :(得分: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
}