地址的价值消失了

时间:2012-08-14 01:37:17

标签: c string

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

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)

发生了什么事?

2 个答案:

答案 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()清理该内存,否则会导致内存泄漏。