字符串数组互相覆盖?

时间:2010-10-19 20:26:16

标签: c arrays

我正在创建一个函数,将一个单词列表转换为一个数组供其他函数使用,但不知怎的,我正在覆盖以前的单词。我查看内存地址'并且它们看起来不一样,但是当我重新检查一次我输入的单词时,它们都是相同的。

static char **array;

//takes the name of a data file and reads it into an array
static void InitDictionary(char *fileName){
  //slide 36, chap 3
  FILE *file;
  int count,i;
  char dummy[30];
  file = fopen(fileName, "r");

  while( fscanf(file, "%s", dummy) == 1 ){//counting at first
    count++;
  }
  fclose(file);

  array = (char**) malloc(count * sizeof(char*) );
  count = 0;
  file = fopen(fileName, "r");
    while( fscanf(file, "%s", dummy) == 1 ){//now putting values in array
      char newEntry[30];
      strcpy(newEntry,dummy);
      array[count] = newEntry;
      printf("%d - %s : %p \n",count, array[count], &array[count]);

      count++;
    }
  fclose(file);

  for(i=0;i<count;i++)
    printf("%d - %s : %p\n",i, array[i], &array[count] );


}

由于

3 个答案:

答案 0 :(得分:5)

每次通过while循环都需要为newEntry分配新的内存。您当前正在多次存储指向单个newEntry缓冲区的指针。

当您说您已经检查了地址时,您具体检查了哪个地址?

实际上,这里技术上可能发生的事情是你在每次迭代while循环后存储对超出范围的变量的引用。由于它超出了范围,因此编译器可以自由地重用它为循环的下一次迭代所做的堆栈内存。

答案 1 :(得分:3)

user470379是正确的,您没有为每个新单词分配空间。一种可能的解决方法是更换三行:

char newEntry[30];
strcpy(newEntry,dummy);
array[count] = newEntry;

array[count] = strdup(dummy);

答案 2 :(得分:0)

我看到的一个问题是,count未初始化,你在malloc中使用它。