将值赋给数组索引返回SIGSEGV;分段故障C

将值赋给数组索引返回SIGSEGV;分段故障C,c,file,segmentation-fault,C,File,Segmentation Fault,我在下面代码的第28行遇到了一个分段错误注意:程序尚未完成。 #包括 #包括 int main(int argc,char*argv[]) { //获取数据 FILE*raw=fopen(“card.raw”、“r”); int rawLength=0; while(fgetc(原始)!=EOF){ rawLength++; } 字符数据[原始长度+1]; fread(数据,1,原始长度+1,原始长度); //将数据分成块 国际数据[sizeof(dat)/512][512]; 数据[0][

我在下面代码的第28行遇到了一个分段错误注意:程序尚未完成。

#包括
#包括
int main(int argc,char*argv[])
{  
//获取数据
FILE*raw=fopen(“card.raw”、“r”);
int rawLength=0;
while(fgetc(原始)!=EOF){
rawLength++;
}
字符数据[原始长度+1];
fread(数据,1,原始长度+1,原始长度);
//将数据分成块
国际数据[sizeof(dat)/512][512];

数据[0][0]=atoi(*dat[0]);//根据我的理解,atoi将字符*字符串转换为整数。
因此,我认为“0-9”之外的字符不起作用。我稍后会检查十六进制和二进制。

为什么不尝试调试它?如果不能使用调试器,请添加打印。例如,在从
原始
文件读入
数据后,检查/打印
rawLength
的值,即
dat
的长度。我猜
dat
不是
“\0”
已终止,但您可以在没有Stackoverflow帮助的情况下找到它。对于
atoi
,不清楚文件的内容是否真的很好;无论如何,除非dat不是以null终止的,否则它不会崩溃。在声明
char-dat[rawLength+1]之后添加
memset(dat,0,sizeof(dat));
在最坏的情况下,数组的最后一个位置将包含一个0。
fread
不读取任何内容。在
fgetc
return
EOF
之后,文件就结束了。
fread
没有更多的内容了。
rawLength
的值是多少?另外,我不相信你理解
atoi
的作用。什么您不希望输出出现错误吗?文件是否存储以零结尾的字符串?谢谢@KamilCuk提供的提示,但我在同一行中仍然遇到相同的问题。您所说的“0-9”之外的字符是什么意思?非常抱歉造成混淆。我想使用“atoi(*…)”而不是“atoi(&…”)。我只是在编辑中修复了它。我想说的是1和“1”是不同的,因此使用atoi()转换它将需要一个由字符“0-9”而不是int 0-9组成的字符串,如果文件的第一个字符是“0xff”,那么它将返回数字,但0xff是ascii[0xff]。好的。感谢您的解释。我更改了
data[i][j]=atoi dat[i+j])59。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{  
    // get data
    FILE* raw = fopen("card.raw", "r");
    int rawLength = 0;
    while(fgetc(raw) != EOF){
        rawLength++;
    }

    char dat[rawLength + 1];
    fread(dat, 1, rawLength + 1, raw);

    // separate data into blocks
    int data[sizeof(dat) / 512][512];

    data[0][0] = atoi(*dat[0]); // <----------- this is line 28 where the error is happening.

    for(int i = 0; i < sizeof(data) / 4; i += 512)
    {
        for(int j = 0; j < 512; j++)
        {
            data[i][j] = atoi(*dat[i + j]);
        }
    }
}