prev up next   top/contents search

comp.lang.c FAQ 列表· 第 7.1 题

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.305.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 ).


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管