C char **数组仅存储最近分配的最后一个字符串

时间:2017-11-05 20:33:01

标签: c arrays initialization

我正在尝试将字典存储到名为spellingList的大型数组中。 fgets()循环似乎工作正常,但是当检查存储在spellingList中的内容时,它会显示数组的每个元素都是zygote(字典中的最后一个单词)。

给定名为 dictionary 的文件,其中包含以下格式的长词列表:

词典

barbecue
barbecue's
barbecued
barbecues
barbecuing
barbed
.
.
.
zwieback's
zygote
zygote's
zygotes

代码

int i = 0;
int j;
char *pos;

    /* Open Dictionary */
FILE *dic;
dic = fopen("dictionary", "r");

    /* Malloc Storage Array */
char **spellingList;
spellingList = malloc (sizeof(char*) * 100000);

if (spellingList == NULL){   // if malloc fails
  printf("%s\n", "Malloc failure");
  exit(0);
}

    /* load dictionary into array */
while (1){
  if (fgets (word, 50, dic) != NULL){         

    if ((pos=strchr(word, '\n')) != NULL){ // replace ending '\n' with a '\0'
      *pos = '\0';
    }
    printf("%d  %s\n", i, word );  // looks as expected
    spellingList[i] = word;
    i++;
  }
  else {
    break;
  }
}  fclose(dic);  // close fd to dictionary

for (j =0; j < 100; j++){  // output
   printf("%d  %s\n", j, spellingList[j]);
}

输出

.
.
.
90  zygotes
91  zygotes
92  zygotes
93  zygotes
94  zygotes
95  zygotes
96  zygotes
97  zygotes
98  zygotes
99  zygotes

1 个答案:

答案 0 :(得分:0)

因为您正在存储指针值,然后更改指针指向的数据将有效地更改数组中的所有值。

你必须复制数据以避免这种情况,一种方法是

spellingList[i] = strdup(word);

换句话说,分配word不会复制数据,它只会使spellingList[i]指向word的内存位置,因此所有元素都指向同一位置。

你必须阅读有关指针的更多信息。