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

如何使用指向指针的指针访问结构体中的指针成员?

问题分析与解决

你的代码触发段错误的核心原因是:仅为二级指针data分配了存储一级指针的内存,但这个一级指针(*data)并未指向有效的mystruct实例,属于野指针。访问野指针的成员必然引发内存访问错误。

修正要点

  1. 给二级指针data分配内存后,必须再为*data(一级指针)分配mystruct结构体实例的内存,让它指向合法的结构体对象。
  2. 修正main函数的标准写法(C标准规定main返回类型为int,第二个参数是字符指针数组)。

修正后的代码

#include <stdlib.h>
#include <stdio.h> // 需包含头文件才能使用printf

typedef struct
{
    int *member;
} mystruct;

int main(int argc, char *argv[])
{
    mystruct **data;
    // 分配存储mystruct*的内存空间
    data = (mystruct**)malloc(sizeof(mystruct*));
    // 分配mystruct实例的内存,让*data指向该实例
    *data = (mystruct*)malloc(sizeof(mystruct));
    
    int c = 5;
    // 此时*data是有效的结构体指针,可安全访问member成员
    (*data)->member = &c;
    printf("Member: %d\n", *((*data)->member));

    // 释放动态分配的内存,避免内存泄漏
    free(*data);
    free(data);
    
    return 0;
}

简化写法(使用栈上结构体)

如果不需要动态分配结构体,也可以用栈上的结构体来简化逻辑,避免内存管理的麻烦:

#include <stdio.h>

typedef struct
{
    int *member;
} mystruct;

int main(int argc, char *argv[])
{
    mystruct s;
    mystruct **data = &s; // 二级指针指向栈上的结构体指针
    int c = 5;
    (*data)->member = &c;
    printf("Member: %d\n", *((*data)->member));
    
    return 0;
}

内容的提问来源于stack exchange,提问作者hoang15nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:15:34