c - 访问结构中的结构指针时出现分段错误
问题描述
我有一个指向 struct 的指针的问题,它的成员也是指向 struct 的指针。
浏览建议的类似问题,我发现了这一点:
人们建议注意结构的分配内存。
我认为这在我的代码中是正确的。
typedef struct {
int id_vec;
float *vec_value;
} Vector;
typedef struct cluster{
int id_cluster;
float *centroid;
Vector *patternInCluster;
} Cluster;
int main(void){
Cluster *cluster_ptr= malloc(3 * sizeof(Cluster));
if (cluster_ptr==NULL){
printf("NULL");
}
cluster_ptr->patternInCluster=malloc(2 * sizeof(Vector *));
if (cluster_ptr->patternInCluster==NULL){
printf("NULL");
cluster_ptr->patternInCluster=NULL;
}
float p1[3]={0.0f,1.0f,2.0f};
Vector *somePattern=malloc(2 * sizeof(Vector));
somePattern[0].id_vec=1;
somePattern[0].vec_value=p1;
somePattern[1].id_vec=2;
somePattern[1].vec_value=p1;
}
然后我希望这个声明有效:
cluster_ptr[1].patternInCluster[1]=somePattern[1];
但它编译并产生分段错误。
出乎意料的是,以下语句没有出错:
cluster_ptr[0].patternInCluster[1]=somePattern[1];
和一个测试告诉我正确的结果(somePattern[1] id and value)
我尝试使用 gdb 进行调试,但我只能看到:
Program received signal SIGSEGV, Segmentation fault.
0x00005555555547fe in main () at test_struct.c:36
36 cluster_ptr[1].patternInCluster[1]=somePattern[1];
我错过了一些分配错误吗?
解决方案
这是因为你没有完全填充东西。
这条线
cluster_ptr->patternInCluster=malloc(2 * sizeof(Vector *));
和说的一样
cluster_ptr[0].patternInCluster=malloc(2 * sizeof(Vector *));
并且确实考虑到cluster_ptr
已分配为 3 Cluster
,在您的代码中执行后者会更清晰。
由于cluster_ptr[1].patternInCluster
没有被赋予一个值,试图取消引用它会导致未定义的行为,但更有可能导致分段错误。
推荐阅读
- neo4j - 如何使用 gremlin 控制台或服务器获取 neo4j 3.4.5 的插件?
- javascript - 为什么当我使用 AJAX 重新加载页面时数据消失了
- magento2 - $product->save() 在 magento 2.1.3 中保存一个简单的产品需要 4 秒
- javascript - Javascript:计算三角形、圆形或矩形面积的 3 个函数返回未定义
- python - PyEval_RestoreThread:plot.show() 上的 NULL tstate
- jquery - 如何在codeigniter中获取事件日历
- vue.js - .then 不使用 axios.put
- android - Xamarin Windowservice and Displaymetrics, cant find SystemService
- firefox - D3JS V5.5 - CSV FireFox 请求不使用 cookie
- javascript - 是否可以在 TypeScript 中创建“弱导出”