每次我尝试为字符串数组分配内存时,我的程序都会失败并显示错误消息“错误读取字符串字符”。 我究竟做错了什么?我的内存分配有问题吗?
char** file2array(char *filename)
{
FILE *fp = fopen(filename, "r");
int i;
int max_line_len = 20;
int num_lines = 6;
char** lines = (char **) malloc(sizeof(char*) * (num_lines + 1));
fseek(fp, 0, SEEK_END);
int chars_num = ftell(fp);
rewind(fp);
for (i = 1; i < (num_lines + 1); i++) {
lines[i] = (char *) malloc(max_line_len + 1);
fgets(lines[i], chars_num, fp);
}
fclose(fp);
return lines;
}
最佳答案
您似乎没有提供实际发出错误消息的代码,因此很难确定它在提示什么。但是,您肯定会遇到循环索引问题:
for (i = 1; i < (num_lines + 1); i++) {
lines[i] = /* ... */
变量 i
从 1
到 num_lines
,从不取值 0
,因此第一个指针在您的动态指针数组(位于索引 0
)从未被初始化。这似乎可以解释为什么后来的一些代码在读取字符时可能会出现问题。
此外,您错误地使用了fgets()
。你告诉它你的缓冲区是 chars_num
字节长,但它们实际上是 max_line_len + 1
字节长。这存在缓冲区溢出的可能性。
的确,我不确定chars_num
的意义是什么。您将其初始化为文件的长度(前提是该长度适合 int
),但我看不出这有什么用。
此外,如果正在读取的文件的行数超过您的考虑(20 字节,包括行终止符)或与您预期的行数 (6) 不同,您的函数可能会返回意外结果。
我没有看到你的内存分配有任何内在问题,但如果我没有严厉批评你强制转换 malloc()
的返回值,它就不会是 StackOverflow >。认为自己受到了鞭打。
关于c - 字符串数组 malloc 后出现 "error reading characters of string"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836433/