在C中读取python生成的二进制数组时出现段错误(核心转储)错误

问题描述 投票:0回答:1

我正在尝试加载由numpy创建的2D数组并读取C中的元素,但是在运行它时出现Segmentation fault(core dumped)错误。代码按

的行进行

#include <stdio.h>
#include <string.h>
int main(){
    char *file;
    FILE *input;
    int N1, N2, ii, jj;
    float element;
    strcpy(file, "/home/caesar/Desktop/test.bin");
    input = fopen(file, "rb");
    fread(&N1, sizeof(int), 1, input);
    fread(&N2, sizeof(int), 1, input);
     float memoryarray[N1][N2];
    for(ii= 0; ii<N1; ii++){
        for(jj=0; jj<N2; jj++){
            fread(&element, sizeof(float), 1, input);
            memoryarray[ii][jj]= element; 
        }
    }
    printf("%f", memoryarray[2][3]);
    fclose(input);
    return 0;
} 

这是一项任务的开始,在该任务中,我必须从400 * 400 * 400左右的矩阵中读取元素。想法是从文件中读取所有元素并将其存储在内存中,然后在必要时从内存索引明智地进行读取,例如,在这里,我正在尝试访问和打印第二行第三列中的元素。

PS:我对指针还很陌生。

亲爱的,我尝试了您说的方法。这里是代码的修改版本,分段错误已消失,但输出要么全为零,要么只是纯垃圾值。我运行了三次可执行文件,得到的输出是输出1:-0.000000输出2:0.000000输出3:-97341413674450944.000000

我的数组包含整数btw

这里是代码的修改版本

#include <stdio.h>
#include <string.h>
void main(){
    const char file[] ="/home/caesar/Desktop/test.bin";
    FILE *input;
    int N1, N2, ii, jj;
    float element;
    //strcpy(file, "/home/caesar/Desktop/test.bin");
    input = fopen(file, "r");
    fread(&N1, sizeof(int), 1, input);
    fread(&N2, sizeof(int), 1, input);
     float memoryarray[N1][N2];
    for(ii= 0; ii<N1; ii++){
        for(jj=0; jj<N2; jj++){
            fread(&element, sizeof(float), 1, input);
            memoryarray[ii][jj]= element; 
        }
    }
    printf("%f", memoryarray[1][2]);
    fclose(input);




[这也是我要打开的文件的十六进制转储。你们中的一些人要求我验证fopen()是否正常工作,我检查了它是否正常工作。

00000000  03 00 00 00 03 00 00 00  01 00 00 00 00 00 00 00  |................|
00000010  02 00 00 00 00 00 00 00  03 00 00 00 00 00 00 00  |................|
*
00000030  04 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00  |................|
00000040  05 00 00 00 00 00 00 00  06 00 00 00 00 00 00 00  |................|
00000050

c arrays readfile
1个回答
4
投票

strcpy(file, "/home/caesar/Desktop/test.bin");

这将写入垃圾内存地址。您应该将文件声明为适当大小的数组,如下所示:

char file[100];

直接用这样的路径初始化char指针(并删除strcpy):

const char *file = "/home/caesar/Desktop/test.bin";

或根据共同的共识,是最好的(请参阅评论):

fopen("/home/caesar/Desktop/test.bin", "rb");
© www.soinside.com 2019 - 2024. All rights reserved.