1

我正在编写一个程序并具有以下循环:

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是一个局部变量,它会以某种方式影响事物(听起来不对)
  • 我还没有正确理解指针或结构(完全有可能,我刚刚开始学习 C)

到底是怎么回事?

4

2 回答 2

4

当您在块中声明newwordif,它会在该块退出后超出范围。如果您希望它持续存在,您需要在外部范围内分配内存,或者在堆上分配字符串malloc

if (c == '\n')
{
    // newword will persist beyond this block:
    char *newword = malloc(strlen(word) + 1);
    strcpy(newword, word);
    words[i].key = newword;

请注意,现在您需要调用free此分配的块,或创建内存泄漏。稍后您需要调用free(words[i].key).

Martin 的使用建议strdup是一个很好的建议,它strdup是可用的:它会为您执行分配 - 但您以后仍需要这样做free

于 2012-08-14T01:40:14.603 回答
2

newword 存储在堆栈中,因此每次执行 while 循环时它都会超出范围。

您需要为它动态分配内存。我建议更换

char newword[strlen(word) + 1];
strcpy(newword, word);

和:

char * newword = strdup(word);

这将分配内存并复制内容。请注意,您应该稍后使用 free() 清理该内存,否则您将有内存泄漏。

于 2012-08-14T01:41:51.527 回答