gpt4 book ai didi

c while循环将循环中的局部变量视为全局变量,为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:32 24 4
gpt4 key购买 nike

下面是一个小型 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] = responsewords[words_added] = tmp

为什么 tmp 变量起作用,而 response 不起作用?

我猜测 response 每次迭代都会有完全相同的地址,而 tmp 每次迭代都会获得一个新地址。但为什么?然而它们都在同一个 while 循环中声明???

最佳答案

当您分配 words[words_added] = response 时,您正在将 response 的地址(而不是内容)复制到数组中。所以在原始形式中,您的代码应该将第二个单词和每个后续单词视为重复项。当您使用 tmp 时,代码会将每个新的 response 与存储在 words[](的每个位置)中的先前 tmp 进行比较,然后将其复制到 tmp(如果不是重复的)。

所以我怀疑您的代码会检测到立即在原始之后出现的重复项,但不会检测到在 2 个或更多单词之后出现的重复项。

words 数组包含 4 个指针,但没有为这些指针分配内存。您需要为 words 数组的每个元素分配内存,然后将每个字符串复制到其中:

if (duplicate_flag == 0)
{
words[words_added++] = strdup(response); // allocates mem and copies the string
puts("that's new!");
} else {
...
}

然后确保在程序结束时释放内存:

for (i = 0; i < words_added; ++i) {
free(words[i]);
}

关于c while循环将循环中的局部变量视为全局变量,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com