2010-10-19 40 views
0

我正在制作一个函数,将单词列表转换为一个数组以供其他函数使用,但不知何故,我会覆盖以前的单词。我检查内存地址',它们看起来不一样,但是当我完成导入单词后重新检查时,它们都是一样的。字符串覆盖对方的数组?

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

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

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

array[count] = strdup(dummy); 
+1

完成后一定要记得释放内存 - 为您必须释放新副本的strdup mallocs空间。 – user470379 2010-10-19 21:28:38

+0

@ user470379 - 确切地说,单独执行strdup是很多繁琐的资源管理。将整个文件读入单个分配的内存块然后索引和NUL终止每个单词可能会更简单快捷。然后,整个事情可以在稍后被释放。 – Blastfurnace 2010-10-19 21:44:24

5

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

当你说你已经检查了地址,你具体检查了什么地址?

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

0

我看到的一个问题是,count没有初始化,并且您在malloc中使用它。