You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建指针变量数组时添加条件导致段错误的原因咨询

段错误原因分析:条件赋值导致未初始化指针

原可运行代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:22:03