使用间接(解引用)运算符修改双指针值引发段错误咨询
问题原因与解决方法
核心问题
你遇到的段错误根源在于**malloc(10)的使用错误**以及对二级指针的初始化逻辑问题:
int **ipp = malloc(10);的问题ipp是一个二级指针(指向int*的指针),但你分配的10字节内存内容是未初始化的垃圾值。当执行*ipp = ip1;时,*ipp会从这块垃圾内存中读取一个随机的无效地址,然后试图将ip1的值写入该地址——这直接触发段错误,因为这个随机地址大概率不属于程序可访问的内存空间。正确的二级指针初始化逻辑
若想让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
相关产品推荐
相关产品推荐

