【发布时间】:2015-03-02 22:38:30
【问题描述】:
我正在尝试编写一个简单的程序,以十六进制输出 16 位块中二进制文件 (Game Boy ROM) 的前 16 KB。然而,在for 循环期间,我的程序总是会出现段错误,但它总是在数组中的不同点出现段错误。代码如下:
#include <stdio.h>
#include <stdint.h>
int main ()
{
uint16_t buffer[8000];
FILE* ROM = fopen("rom.gb", "rb");
if (ROM == NULL)
{
printf("Error");
fclose(ROM);
return 1;
}
fread(buffer, sizeof(buffer), 1, ROM);
int i;
for(i = 0; i < sizeof(buffer); ++i)
{
if (buffer[i] < 16)
{
printf("000%x ", buffer[i]);
}
else if (buffer[i] < 256)
{
printf("00%x ", buffer[i]);
}
else if (buffer[i] < 4096)
{
printf("0%x ", buffer[i]);
}
else
{
printf("%x ", buffer[i]);
}
}
fclose(ROM);
return 0;
}
在我改用 uint16_t 而不是 char 之前(因为 Game Boy 有 16 位地址空间),这并没有发生,事实上,如果我包含声明
unsigned char buffer2[16000];
在第一个缓冲区的声明旁边,我得到了预期的输出。所以我的问题是,为什么添加一个未使用的变量会阻止程序出现段错误?我怎样才能避免这样做并声明一个在程序中完全未使用的巨大数组?
【问题讨论】:
标签: c arrays linux segmentation-fault