我有一个非常奇怪的错误,我会尝试运行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被注释掉时代码运行。知道为什么会这样吗?
答案 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,因为您正在使用该类型的大小。你确定这是对的吗?