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;
}
答案 0 :(得分:7)
answer
是一个自动局部变量,一旦函数返回就不存在,因此指向它的指针将变为无效。永远不要返回指向自动局部变量的指针。
可以返回指向static
局部变量的指针
static char answer[100];
或者您可以使用动态分配
char *answer = malloc(100);
答案 1 :(得分:2)
<强>问题:强>
{
char c, answer[100];
//code
return answer; <--- Here
}
answer
是getLine()
的本地版,具有自动存储功能。一旦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
}