我正在编写一个程序,并有以下循环:
while ((c = getchar()) != EOF){
if (c == '\n'){
char newword[strlen(word) + 1];
strcpy(newword, word);
words[i].key = newword;
memset(word, '\0', MAXLENGTH);
i++;
j = 0;
} else {
word[j++] = c;
}
}
words
是一个结构数组:
struct kvp{
char *key;
int line;
};
和word
是一个大数组(大小为MAXLENGTH
),其前几个值构成一个字符串。
问题在于words[i].key
。在if语句中,打印它(在将其设置为newword
之后)将返回正确的值,即,与输入的单词相同的最小大小的字符串。一旦if语句退出并且我们回到while循环的外部主体中,它就会变成完全随机的东西,即?HBk?
。
我怀疑有三件事可能发生:
strcpy
不按我认为的方式行事newword
是一个局部变量,它会以某种方式影响事物(听起来不对)发生了什么事?
答案 0 :(得分:4)
当您在newword
块中声明if
时,它会在该块退出后超出范围。如果您希望它持久化,您需要在外部作用域中分配内存,或者使用malloc
在堆上分配字符串。
if (c == '\n')
{
// newword will persist beyond this block:
char *newword = malloc(strlen(word) + 1);
strcpy(newword, word);
words[i].key = newword;
请注意,现在您需要在此alloc'd块上调用free
,或者创建内存泄漏。稍后您需要致电free(words[i].key)
。
Martin建议使用strdup
是一个很好的建议,它strdup
可用:它会为你做分配 - 但你以后仍然需要free
。
答案 1 :(得分:2)
newword存储在堆栈中,因此每次while循环执行时它都会超出范围。
您需要为其动态分配内存。我建议更换
char newword[strlen(word) + 1];
strcpy(newword, word);
使用:
char * newword = strdup(word);
这将分配内存并复制内容。请注意,您应该稍后使用free()清理该内存,否则会导致内存泄漏。