0

我有一个文件,我想从中读取数据并将数据存储到一个 char 数组中,我在每个字符读取后动态分配内存。我想动态地将内存分配到所需的大小。这是我所拥有的:

FILE *fp;
char *data;
int c=0;

fp=fopen("home/bob/Downloads/filename", "r");
data=malloc(sizeof(char));

do{
    data[c]=fgetc(fp);
    printf("data : %c\n", data[c]);
    c++;
    data=realloc(data, sizeof(char)+c);
} while(data[c]!=EOF);

我得到一个分段错误。

4

6 回答 6

2

问题很可能在这里:

while(data[c]!=EOF)

请记住,您在循环内部增加 ,因此您分配的内存的未初始化部分也是如此。这意味着只要此未初始化的数据 not ,您将继续逐字符读取,这可能会远远超出文件的实际结尾。cdata[c](char) -1

而是尝试这样的事情:

char *data = NULL;
size_t c = 0;

for (;;)
{
    const int ch = fgets(fp);
    if (ch == EOF)
        break;  /* Error or end of file */

    char *tmp = realloc(data, c + 1);
    if (tmp == NULL)
        break;  /* Could not allocate memory */

    data = tmp;
    data[c++] = ch;
}
于 2013-10-01T08:37:04.463 回答
1

当您的程序尝试评估以下条件时:

(data[c]!=EOF)

已经c递增,data[c]因此尝试访问超出data数组范围的元素,导致未定义的行为

于 2013-10-01T08:34:47.310 回答
1

首先,您必须使用带有 malloc 的类型转换,因为 malloc 返回 void*

data=(char*)malloc(sizeof(char));

此外,EOF 不是字符(EOF=-1)

while 循环内的条件指向内存中尚未初始化的部分。

int ch;
while(1)
{
if( (ch=fgets(fp))==EOF )
    break;
data[c]=ch;
c++;
data=realloc(data, sizeof(char)+c);
}
于 2013-10-01T10:17:16.270 回答
0

您已分配一个字节的内存。这绝对不足以读取文件。

我建议使用stat()解释你如何确定 C 中文件的大小?获取大小然后分配size*sizeof(char)

#include <sys/stat.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

{
    FILE *fp;
    char *data;
    int c=0;
    off_t size = fsize("home/bob/Downloads/filename") +1;

    fp=fopen("home/bob/Downloads/filename", "r");
    data=malloc(sizeof(char) * size);

    do{
        data[c]=fgetc(fp);
        printf("data : %c\n", data[c]);
        c++;
        data=realloc(data, sizeof(char)+c);
    }while(data[c]!=EOF);
}
于 2013-10-01T08:34:07.300 回答
0
do{
    data[c]=fgetc(fp);
    printf("data : %c\n", data[c]);
    c++;
    data=realloc(data, sizeof(char)+c);
}while(data[c]!=EOF);  // this should be the location of the seg fault

While (data[c]) 查找数组末尾的后面。

}while(data[c - 1]!=EOF);

或在检查后增加 c

于 2013-10-01T08:34:54.230 回答
0
data[c]=fgetc(fp);  --> This gives seg fault 

因为你是这样递增的c++

data=malloc(sizeof(char));

data指向sizeof(char)你什么时候做c++然后data[c]变成UB的记忆。

于 2013-10-01T08:35:08.217 回答