从文件读取到缓冲区时的分段错误

时间:2014-04-09 08:04:14

标签: c sockets buffer fread

我需要读取一个文件,然后通过套接字发送它,但由于某种原因导致崩溃。 有什么想法吗?

//Get file length
fseek(fd, 0, SEEK_END);
int fileLen=ftell(fd);
fseek(fd, 0, SEEK_SET);

//Allocate memory
buf=(char *)malloc(fileLen+1)* sizeof(char));
if (!buf)
{
    fprintf(stderr, "Memory error!");
}
rewind(fd);

fread((void *)buf, strlen(buf)+1, 1, fd);

2 个答案:

答案 0 :(得分:3)

该代码中存在相当多的基本混淆。

  • ftell()返回long,而不是int。此外,它应该是const,因为我们在阅读时假定文件的大小不会改变。
  • 无需拨打rewind() 使用fseek()来抵消0。
  • Don't cast the return value of malloc() in C
  • 你不是在处理字符串,所以不要为某些字符串添加一个"终结符"。
  • 不要按sizeof (char)扩展分配,而且始终为1。
  • 在依赖结果之前检查分配是否成功。
  • 不要将缓冲区指针强制转换为void *中的fread(),这完全没有意义。
  • 使用fread()中的文件长度,在未定义的指针上调用strlen()是未定义的行为。
  • 验证fread()是否成功。

答案 1 :(得分:1)

fread((void *)buf, strlen(buf)+1, 1, fd);

应该是

fread((void *)buf, 1, fileLen, fd);

您未初始化buf的内容,因此strlen(buf)不会返回buf的正确长度。

顺便说一下,buf=(char *)malloc(fileLen+1)* sizeof(char));应该是buf=(char *)malloc(fileLen);,不需要分配额外的字节,sizeof(char)总是返回1.