下面是一个小的C应用程序。它会要求你输入一个单词。它停止询问何时获得四个独特的单词。但是在下面显示的形式中,直到取消注释相关行后才能正常运行。c while循环将局部变量视为全局循环,为什么?
#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
将获得一个新的地址每次迭代。但为什么?但它们都是在同一个循环中声明的?
您的代码被严重破坏并显示未定义的行为。你的问题是,你还没有为现有单词列表分配任何永久存储 - 只有指向它们的指针。 – dmckee 2012-02-21 21:59:19
[你真的不想让你的程序成为缓冲区溢出开发的入口](http://stackoverflow.com/a/456312/1025391)! – moooeeeep 2012-02-21 22:23:18
@moooeeeep这将是一个有点偏执这里,这只是一个小例子的代码片段,但指出;-) – 2012-02-22 07:19:44