fopen()在调用之前导致段错误

时间:2014-12-06 16:37:31

标签: c segmentation-fault fopen

我有一个非常奇怪的错误,我会尝试运行valgrind,但我在OS X Yosemite,所以这是不可能的。我得到了一个fopen的段错误,似乎在fopen甚至被召唤之前。我有一个名为format的函数:

void format(uint16_t sector_size, uint16_t cluster_size, uint16_t disk_size)
{ 
FILE *fp;
fp=fopen(diskName, "wb");
if(fp != NULL)
{
    printf("Disk successfully initialized at: %s",diskName);

}
else
{
    printf("There was an error creating the disk.");
    return;
}

for(int i=0;i<disk_size;i++)
{
    fwrite(0, sizeof(sector_size), cluster_size, fp);
}
}

Diskname在文件顶部全局声明:

char diskName[32];

这是我的主要内容:

int main(int argc, char *argv[]) {
strcpy(diskName, "test.bin");
printf("%s",diskName);
format(128, 8, 1000);
}

奇怪的是,这段代码在打印磁盘名之前会发生段错误:

Run Command: line 1: 16016 Segmentation fault: 11

我不知道这是怎么可能的,我已经尝试了一系列广泛的解决方案,但这一切都归结为fopen的错误。当fopen被注释掉时代码运行。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

printf将缓冲其输出,直到您刷新输出。这可以通过打印换行符或使用fflush(stdout)刷新输出来完成。

无论如何,你的错误就在这里:

fwrite(0, sizeof(sector_size), cluster_size, fp);

当您注释掉fopen电话时,您可能看不到程序崩溃,因为fwrite电话会提前失败。 fwrite的签名要求数据的指针作为第一个参数写入,其中您提供了零。这将导致fwrite尝试取消引用NULL指针,从而崩溃。

您可以分配缓冲区,将其全部设置为零,然后使用fwrite将其写入文件,例如

char* buf = calloc(cluster_size, sector_size); // Remember, calloc initialises all elements to zero!
fwrite(buf, sector_size, cluster_size, fp);

或者只是在循环中调用fputc

for(int i = 0; i < sector_size * cluster_size; i++)
    fputc(0, fp);

此外,sizeof(sector_size) 总是在您的示例中返回2,因为您正在使用该类型的大小。你确定这是对的吗?