C语言中如何向函数传递结构体数组内的指针地址?
结构体指针传递引发的段错误问题分析与解决
咱们先把问题的核心拆解清楚:你遇到的段错误,根源是运算符优先级的误解,导致函数里访问了完全非法的内存地址,和指针传递的方式本身无关。
问题本质
你传递的&(pixel_data[0]->location)是一个double**类型指针,它指向的是pixel_data[0]->location这个double*指针本身。但在update_centroid_location函数里,你写了这样一行代码:
old_cent[i] = *centroid[i];
这里的数组下标[]优先级比解引用*更高,所以这行代码等价于:
old_cent[i] = *(centroid[i]);
也就是说,你错误地把centroid当成了一个double*类型的指针数组,试图访问它的第i个元素再解引用。但实际上centroid只是一个指向单个double*指针的指针,并不是数组。当i>0时,centroid[i]会指向完全无关的内存区域,解引用自然触发段错误。
修正方案
你真正要做的是:先解引用centroid拿到pixel_data[0]->location这个double*指针,再访问它的第i个元素。只需要给*centroid加上括号,明确优先级即可:
old_cent[i] = (*centroid)[i];
修正后的完整函数示例
void update_centroid_location(double **centroid, int centroid_num, int numpix){ double * old_cent = malloc(DIMENSIONS * sizeof(double)); if(!old_cent){ perror("couldnt allocate memory"); exit(4); } // 修正运算符优先级,先拿到location指针,再访问数组元素 for(int i=0; i<DIMENSIONS; i++){ old_cent[i] = (*centroid)[i]; } // 注意:后续记得释放old_cent,避免内存泄漏 // ... 你的其他业务逻辑 ... free(old_cent); }
额外说明
你传递指针的方式&(pixel_data[0]->location)是完全正确的,之前调试时看到函数内*arr值和main里不一致,也是错误访问方式导致的假象,修正后这个问题也会同步消失。
内容的提问来源于stack exchange,提问作者thedeg123
相关产品推荐
相关产品推荐

