gpt4 book ai didi

c - 更改值时出现段错误,但在打印时不会出现段错误

转载 作者:行者123 更新时间:2023-12-03 23:40:13 24 4
gpt4 key购买 nike

在以下代码中,我初始化了另一个结构体中的结构体数组。初始化数组后,我可以在循环 #1 中毫无问题地打印所有值。
但是,如果我尝试更改值,就像在循环 #2 中一样,当我尝试访问正好位于数组中间的元素时(即当 j==points/2 或 50 在这个特定的案件)。
为什么访问元素以打印它但尝试更改它会导致段错误?

#include <stdio.h>
#include <stdlib.h>

struct flux{
double *intense;
double *tau;
};

struct radius_struct{
int id;
struct flux *flux;
};

int main(int argc, const char * argv[]) {

int i,j, ichan, points,nchan;
points = 100;
nchan = 20;

struct radius_struct radius_struct;
radius_struct.id = 99;
radius_struct.flux = malloc(sizeof(double) * points);


for(i = 0; i < points; i++){
radius_struct.flux[i].intense= malloc(sizeof(double) * nchan);
radius_struct.flux[i].tau= malloc(sizeof(double) * nchan);

for(ichan=0;ichan<nchan;ichan++){
radius_struct.flux[i].intense[ichan] = ichan;
radius_struct.flux[i].tau[ichan] =ichan;
}
}

//Loop #1
for(j = 0; j < points; j++){
for(ichan=0; ichan<nchan; ichan++){
printf("%f %f\n", radius_struct.flux[j].intense[ichan], radius_struct.flux[j].tau[ichan]);
}
}

//Loop #2
for(j = 0; j < points; j++){
for(ichan=0; ichan<nchan; ichan++){
radius_struct.flux[j].intense[ichan] = 123.456;
radius_struct.flux[j].tau[ichan] = 123.456;
}
}

return 0;
}

最佳答案

避免分配大小错误。
分配给引用对象的大小。更容易正确编码、审查和维护。

//                             v------------v wrong size 
// radius_struct.flux = malloc(sizeof(double) * points);
radius_struct.flux = malloc(sizeof *(radius_struct.flux) * points);
// ^--------------------------^ right size, even without looking up .flux type.

why doesn't it fail when accessing them in the initialization or when printing them before Loop #2? –

radius_struct.flux[i].intense并且所有以下代码都是可疑的,并且会受到未定义行为的影响,因为先前的分配肯定是不够的。有些事情可能会奏效,有些可能不会。另见 @CiaPan .

健壮的代码还将检查分配失败的返回指针,并检查 NULL .

关于c - 更改值时出现段错误,但在打印时不会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66142153/

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