C 未定义未使用数组的分段错误

C 未定义未使用数组的分段错误,c,arrays,linux,segmentation-fault,C,Arrays,Linux,Segmentation Fault,我正在尝试编写一个简单的程序,以十六进制输出16位块的二进制文件(Game Boy ROM)的前16千字节。但是,在for循环期间,我的程序将始终SEGFULT,但它总是在阵列中的不同点SEGFULT。代码如下: #include <stdio.h> #include <stdint.h> int main () { uint16_t buffer[8000]; FILE* ROM = fopen("rom.gb", "rb"); if (ROM

我正在尝试编写一个简单的程序,以十六进制输出16位块的二进制文件(Game Boy ROM)的前16千字节。但是,在
for
循环期间,我的程序将始终SEGFULT,但它总是在阵列中的不同点SEGFULT。代码如下:

#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; 
}
在第一个缓冲区的声明旁边,我得到了预期的输出。所以我的问题是,为什么添加一个未使用的变量会阻止程序出错?我如何才能避免这样做并声明一个在程序中完全未使用的巨大数组?

在这行:

for(i = 0; i < sizeof(buffer); ++i)
(i=0;i
sizeof(buffer)
是数组的大小(以字节为单位),如果需要使用的元素数


i<(sizeof(buffer)/sizeof(buffer[0])
我不确定您是否正确使用了
fread
,如果您查看,第二个参数是每个元素的大小,而您传递的是整个缓冲区的大小

您可能希望交换第二个和第三个参数,请参阅以获取用法示例


另请注意,正如Alter Mann所指出的,您需要将缓冲区的大小除以其类型的大小。

非常感谢,这解决了问题,并且我在循环过程中不再出现SEGFULTS。这也很有帮助,谢谢。我将该行更改为
fread(buffer,2,(sizeof(buffer)/sizeof(buffer[0])),ROM
提供相同的输出,但应该更正确。考虑到我滥用该功能的程度有多严重,我很惊讶它竟然能正常工作。
for(i = 0; i < sizeof(buffer); ++i)