gpt4 book ai didi

C:为什么我在一种情况下出现段错误,而在另一种情况下却没有?

转载 作者:行者123 更新时间:2023-12-01 08:56:56 25 4
gpt4 key购买 nike

我是 C 的新手,所以我认为由于缺乏指针和内存分配的基础知识,我的代码中某处存在新手错误。

我有一个表示数字数据的二进制文件,我正在尝试读取和存储该数据。这是打开文件的代码的第一部分,读取文件中的第几个数字,然后用于为结构 emxArray_real_T 分配足够的内存。

结构:

struct emxArray_real_T
{
real_T *data;
int32_T *size;
int32_T allocatedSize;
int32_T numDimensions;
boolean_T canFreeData;
}

主要的第一部分:

# include <stdio.h>
# include <stdlib.h> /*atoi*/
# include <assert.h>

int main(int argc, char** argv){

//Variable declaration
unsigned short numOfSums;
unsigned long chSum, countRSN, countPeriods;
int i,j;
FILE *file;

//Open file
file = fopen("testBin.bin","rb");

//Read first number that tells how many items to skip
fread(&numOfSums, 2, 1,file);
//Skip that many items
for (i=0;i<numOfSums;i++){
fread(&chSum,4,1,file);
}
//Read next two numbers
fread(&countRSN,4,1,file);
fread(&countPeriods,4,1,file);

//Allocate enaugh space based on the size of countRSN and countPeriods
struct emxArray_real_T* Sa_1 = malloc(sizeof(*Sa_1)*1);
assert(Sa_1 != NULL);
Sa_1->data=malloc(sizeof(real_T)*countRSN*countPeriods);
Sa_1->size=malloc(sizeof(int32_T)*2);
Sa_1->allocatedSize=(sizeof(int32_T)*1);
Sa_1->size[0]=countRSN;
Sa_1->size[1]=countPeriods;

struct emxArray_real_T *Sa_2;
Sa_2=(struct emxArray_real_T*)malloc(sizeof(struct emxArray_real_T)*1);
assert(Sa_2 != NULL);
Sa_2->data=(real_T*)malloc(sizeof(real_T)*countRSN*countPeriods);
Sa_2->size=malloc(sizeof(int32_T)*2);
Sa_2->allocatedSize=(sizeof(int32_T)*1);
Sa_2->size[0]=countRSN;
Sa_2->size[1]=countPeriods;

struct emxArray_real_T *sVs30;
sVs30=(struct emxArray_real_T*)malloc(sizeof(struct emxArray_real_T));
sVs30->data=malloc(sizeof(real_T)*countRSN);
sVs30->size=malloc(sizeof(int32_T)*1);
sVs30->allocatedSize=(sizeof(int32_T)*1);
sVs30->size[0]=countRSN;

问题来了。如果我尝试存储我的数据并转置它,因为它的顺序不正确,我会得到段错误,

for (i=0;i<countRSN;i++){
for (j=0;j<countPeriods;j++){
fread(&Sa_1->data[countRSN*j+i],8,1,file);
}
}

如果我只是这样尝试,它是有效的:

for (i=0;i<countRSN*countPeriods;i++){
fread(&Sa_1->data[i],8,1,file);
}

.
.
.

fclose(file);

free(Sa_1);
free(Sa_2);
free(sVs30);
return 0;
}

最佳答案

您假设类型的大小。在任何使用 4、2、8 等的地方使用 sizeof。还要确保 fread 可以与 short int 一起使用,我对此表示怀疑

关于C:为什么我在一种情况下出现段错误,而在另一种情况下却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com