繁体   English   中英

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

[英]segmentation fault when reading from file to buffer

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

//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);

该代码中有很多基本的混淆。

  • ftell()返回long ,而不是int 另外,它应该是const ,因为假定文件大小在我们读取文件时不会改变。
  • 无需调用rewind() 使用fseek()偏移0。
  • 不要在C中malloc()的返回值
  • 您不是在处理字符串,所以不要为“终止符”添加一个。
  • 不要按sizeof (char)缩放分配,始终为1。
  • 依赖结果之前,请检查分配是否成功。
  • 不要将缓冲区指针转换为fread()中的void * ,这是毫无意义的。
  • 使用fread()的文件长度,在未定义的指针上调用strlen()是未定义的行为。
  • 验证fread()成功。
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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM