我理解下面代码的问题是存储输入的char数组是在本地函数中。当指向该char数组的指针传递给main函数时,应该从堆栈中删除该char数组。
但是,当我尝试打印字符串时,尽管编译器警告,它仍会打印。但是如果我尝试在函数调用和print语句之间放置一个计时器,则字符串为空。 为什么是这样? “垃圾收集”是否比打印语句慢?
没有睡眠的输出:
“String is [string]”
睡眠输出:
“字符串是”
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define MAX 20
char* get_user_input();
int main (){
char *choice;
choice = get_user_input();
//sleep(1);
//Add sleep and it won't print
printf("String: %s\n", choice);
}
char* get_user_input( ) {
char inbuffer[MAX];
char *pos;
printf("Enter string>");
fgets (inbuffer, MAX, stdin);
pos = strchr( inbuffer, '\n' );
if ( pos != NULL ){
*pos = '\0';
}
return inbuffer;
}
答案 0 :(得分:1)
主要是由于重写了堆栈,请考虑:
char* get_user_input( ) {
char inbuffer[MAX];
char *pos;
...
}
void anotherfunc( ) {
char a[MAX];
char *b;
}
int main (){
char *choice;
choice = get_user_input();
anotherfunc();
printf("String: %s\n", choice);
}
对anotherfunc
的调用将使用与get_user_input()相同的堆栈内存,在这种情况下,实际上没有任何内容写入[]或* b,因此您的*选择可能会持续存在 - 只是。如果一个函数有任何写入的局部变量,则无效的choice
指针将指向那里写的任何内容。