创建指针变量数组时添加条件导致段错误的原因咨询
段错误原因分析:条件赋值导致未初始化指针
原可运行代码
#include <stdio.h> int main() { int *array2Ptr[3]; int array2[3][5] = {{4,4,5,5,8},{2,8,2,3,6},{8,8,6,6,1}}; for ( size_t i = 0 ; i < 3 ; ++i) { array2Ptr[i] = &array2[i][4]; } for (size_t i = 0 ; i < 3 ; ++i) { printf("%d ", *array2Ptr[i]); } }
修改后出现段错误的代码
#include <stdio.h> int main() { int array1[3] = {3,0,3}; int array2[3][5] = {{4,4,5,5,8},{2,8,2,3,6},{8,8,6,6,1}}; int *array2Ptr[2]; // 预期只存2个值,所以设为大小2 for ( size_t i = 0 ; i < 2 ; ++i) { if ( array1[i] != 0 ) { array2Ptr[i] = &array2[i][4]; } } for (size_t i = 0 ; i < 2 ; ++i) { printf("%d ", *array2Ptr[i]); } }
错误原因
当循环到i=1时,array1[1]的值是0,不满足array1[i] != 0的条件,因此array2Ptr[1]没有被赋值,属于未初始化的野指针。野指针指向随机的无效内存地址,后续printf尝试解引用这个指针时,程序会访问不属于自身的内存,触发段错误。
修复方案
不要直接用循环变量i作为array2Ptr的索引,改用独立计数器记录有效指针的位置,确保array2Ptr的每个元素都被正确初始化:
#include <stdio.h> int main() { int array1[3] = {3,0,3}; int array2[3][5] = {{4,4,5,5,8},{2,8,2,3,6},{8,8,6,6,1}}; int *array2Ptr[2]; size_t validIdx = 0; // 记录有效指针的存储位置 // 遍历所有array1元素,筛选符合条件的项 for (size_t i = 0; i < 3; ++i) { if (array1[i] != 0 && validIdx < 2) { array2Ptr[validIdx++] = &array2[i][4]; } } // 只打印已初始化的有效指针 for (size_t i = 0; i < validIdx; ++i) { printf("%d ", *array2Ptr[i]); } }
内容的提问来源于stack exchange,提问作者Talete
相关产品推荐
相关产品推荐

