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

使用间接(解引用)运算符修改双指针值引发段错误咨询

问题原因与解决方法

核心问题

你遇到的段错误根源在于**malloc(10)的使用错误**以及对二级指针的初始化逻辑问题:

  1. int **ipp = malloc(10);的问题
    ipp是一个二级指针(指向int*的指针),但你分配的10字节内存内容是未初始化的垃圾值。当执行*ipp = ip1;时,*ipp会从这块垃圾内存中读取一个随机的无效地址,然后试图将ip1的值写入该地址——这直接触发段错误,因为这个随机地址大概率不属于程序可访问的内存空间。

  2. 正确的二级指针初始化逻辑
    若想让ipp间接指向ip1,有两种正确方式:

    • 方式一:让ipp直接指向已存在的指针变量(即你原本的ipp = &ip1;写法,逻辑正确)
    • 方式二:先为二级指针分配能容纳int*的内存空间,再给*ipp赋值:
      // 分配对应类型大小的内存,而非固定10字节
      int **ipp = malloc(sizeof(int*));
      // 此时*ipp指向有效内存空间,可安全赋值
      *ipp = ip1;
      **ipp = 3; // 等价于*ip1,即修改i的值,无内存访问问题
      

修正后的示例代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i = 1, j = 2 ; 
    // 分配正确大小的内存
    int **ipp = malloc(sizeof(int*)); 
    int *ip1 = &i, *ip2= &j ;  

    // 取消注释后不会触发段错误
    *ipp = ip1 ;
    **ipp = 3; 

    printf("ipp: %p %p %d\n",ipp,*ipp , **ipp);
    printf("ip1:    %p %d\n",ip1,*ip1 );
    printf("ip2:    %p %d\n",ip2,*ip2);
    printf("i:         %d\n",i);
    printf("j:         %d\n",j);
    
    // 释放malloc分配的内存,避免内存泄漏
    free(ipp);
    return 0 ;
}

额外注意事项

  • 禁止对未初始化的指针进行读写操作,malloc分配的内存内容是随机的,必须先初始化再使用。
  • 分配内存时,用sizeof(目标类型)指定大小,而非固定数字,适配不同平台的内存布局。
  • 使用malloc后务必用free()释放内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者mohammad hosein rezanezhad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:25:07