Q这段代码为什么不能工作?
char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", answer);
A指针变量answer,它是传递给gets()的,用来存放响应的存储位置,并没有被设置指向任何有效的存储。它是一个未初始化的变量,正如变量i中
int i; printf("i = %d\n", i);一样。也就是说,在第一段代码中,我们无法确定指针answer指向哪里,正如我们无法确定i的值将是什么。 (由于局部变量未被初始化,通常包含垃圾值,因此不能保证answer开始时是一个空指针。请参见问题 1.30 和 5.1。)
纠正提问程序的最简单方法是使用局部数组,而不是指针,并让编译器负责内存分配。
#include <stdio.h> #include <string.h> char answer[100], *p; printf("Type something:\n"); fgets(answer, sizeof answer, stdin); if((p = strchr(answer, '\n')) != NULL) *p = '\0'; printf("You typed \"%s\"\n", answer);此示例还使用了fgets()来解决这个问题,而不是gets(),因此数组末尾不会被覆盖。(请参见问题 12.23。不幸的是,对于这个例子,fgets()不会自动删除末尾的\n,而gets()会。)也可以使用malloc()来分配answer缓冲区,并用(类似#define ANSWERSIZE 100 ).