c编程,读取文件后内存丢失

时间:2018-11-24 06:14:55

标签: c

这是我的c代码的一部分,该程序将读取由行分隔的关键字文件,并将其存储到字符串数组中。.....

int keyno = 4;
char *keywords[keyno];
char var[100];
i=0;
while(fgets(var, sizeof(var), k)!=NULL){   //k is the file
    printf("var: %s", var);
    if(i>0)
        keywords[i-1]=var;
    printf("keyword: %s", keywords[i-1]);
    i++;
}

for (i=0; i<keyno;i++)
    printf("keyword: %s", keywords[i]);

结果:

var:
keyword: (null)
var: abc
keyword: abc
var: def
keyword: def
var: ghi
keyword:ghi
var: jkl
keyword: jkl
var:
keyword: @-g(?)

keyword: @-g(?) keyword: @-g(?) keyword: @-g(?) keyword: @-g(?)

为什么关键字在forloop中消失了...?我应该添加哪一行?

3 个答案:

答案 0 :(得分:2)

char *keywords[keyno];

是一个指针数组。

在此行的循环中

keywords[i-1]=var;

您使keywords中的所有指针都指向var。因此,当您打印keywords时,实际上实际上只打印了var次。

相反,您可以这样做

char keywords[keyno][100];

并复制如下:

strcpy(keywords[i-1], var);

答案 1 :(得分:0)

在声明这样的数组时

char* keywords[keyno];

您要声明一个指向字符串的指针数组。但是指针需要指向某个地方 并且每个指针都需要指向不同的位置。

keywors[i-1]=var;

使每个指针指向相同的地址,即数组var

的地址

要解决此问题,请在从文件中获取内容时分配内存。

例如

keywords[i-1] = malloc(strlen(var)+1); /* allocate memory */
strcpy(keywords[i-1], var);  /* copy to the newly allocated memory */

稍后您需要释放该内存

for (int i = 0; i < keyno; ++i)    
  free(keywords[i[);

作为预防措施,请确保在程序的开头将所有指针都设置为NULL,因为在未初始化的指针上释放是未定义的行为,但是释放NULL指针是可以的。

char* keywords[key];
for (int i = 0; i < keyno; ++i)
  keywords[i] = NULL;
...
while(fgets(var, sizeof(var), k)!=NULL){  ... }
...
for (int i = 0; i < keyno; ++i)    
  free(keywords[i[);

答案 2 :(得分:-2)

简而言之,var只是一个指针(它实际上是一个数组,但是区别在这里不相关)。这意味着:

  • keywords[i-1]=var将所有数组项分配给该指针(因此它们存储相同的值)。
  • var变得很奇怪之后(当fgets返回null时会发生这种情况),所有条目也变得很奇怪。

一种简单的解决方案是将keywords声明为char keyword[num][len],即IIRC,并直接在keyword[i]内部进行读取。