【发布时间】:2012-02-21 21:53:06
【问题描述】:
下面是一个小的 C 应用程序。它会要求您输入一个单词。它停止询问何时获得了四个独特的单词。但在下面显示的表单中,除非您取消注释相关行,否则它不会正常运行。
#include <stdio.h>
#include <string.h>
#define WORDS_COUNT 4
int main()
{
char* words[WORDS_COUNT];
int words_added = 0;
while (words_added<WORDS_COUNT)
{
puts ("\n-------enter a word-------");
char response[250];
scanf("%s", response);
int i;
int duplicate_flag = 0;
for (i=0; i < words_added; i++)
{
if (strcmp(words[i], response) == 0)
{
duplicate_flag = 1;
break;
};
};
if (duplicate_flag == 0)
{
//char tmp[250];
//strcpy(tmp, response);
words[words_added] = response; //words[words_added] = tmp;
puts("that's new!");
words_added ++;
} else {
puts("you've said that already...");
};
};
return 0;
};
如您所见,主要区别在于words[words_added] = response 和words[words_added] = tmp。
为什么tmp 变量可以工作,而response 却不行?
我猜response 每次迭代都会有完全相同的地址,tmp 每次迭代都会得到一个新地址。但为什么?然而它们都在同一个while循环中声明???
【问题讨论】:
-
您的代码严重损坏并表现出未定义的行为。您的问题是您没有为现有单词列表分配任何永久存储空间 - 只有指向它们的指针。
-
@moooeeeep 在这里会有点偏执,这只是一个小示例代码 sn-p,但要点 ;-)
标签: c memory while-loop