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

如何在多个函数间传递结构体指针?编译错误排查

解决C语言二级指针传递结构体时的编译错误

错误原因分析

你在gen_img函数中错误地直接对二级指针img使用->访问结构体成员。img的类型是Image**(指向Image*的指针),并非结构体/联合体实例,也不是指向结构体的一级指针,因此无法直接用->操作。必须先通过*解引用二级指针,得到指向Image结构体的一级指针后,才能用->访问成员。

修正后的基础版本代码

针对你提供的代码,只需修改gen_img函数中访问成员的方式:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct {
    uint16_t w, h;
    uint32_t* pixels;
} Image;

void gen_img(Image** img)
{
    // 先解引用二级指针得到Image*,再访问结构体成员
    (*img)->pixels = malloc(sizeof(uint32_t) * (*img)->w * (*img)->h);
    // 必须检查malloc是否成功,避免空指针访问导致崩溃
    if ((*img)->pixels == NULL) {
        perror("malloc for pixels failed");
        exit(EXIT_FAILURE);
    }

    for (int x = 0; x < (*img)->w; x++)
        for (int y = 0; y < (*img)->h; y++)
            (*img)->pixels[y * (*img)->w + x] = 0xFF000000;
}

Image* create_img(uint16_t w, uint16_t h)
{
    Image* img = malloc(sizeof(Image));
    if (img == NULL) {
        perror("malloc for Image failed");
        exit(EXIT_FAILURE);
    }

    img->w = w, img->h = h;
    gen_img(&img);
    
    return img;
}

int main(void)
{
    Image* img = create_img(32, 32);

    for (int x = 0; x < img->w; x++)
        for (int y = 0; y < img->h; y++)
            printf("%x\n", img->pixels[y * img->w + x]);

    // 记得释放内存,避免泄漏
    free(img->pixels);
    free(img);
    return 0;
}

结合实际场景的优化(初始NULL指针的情况)

根据你补充的说明,实际场景中你传递的是初始为NULL的指针,这种情况下二级指针的作用就是允许函数内部修改外部指针的指向(比如为其分配内存)。以下是更贴合该场景的实现:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct {
    uint16_t w, h;
    uint32_t* pixels;
} Image;

// 直接在函数内部分配结构体和像素内存
void gen_img(Image** img, uint16_t w, uint16_t h)
{
    // 分配结构体内存,修改外部指针的指向
    *img = malloc(sizeof(Image));
    if (*img == NULL) {
        perror("malloc for Image failed");
        exit(EXIT_FAILURE);
    }
    (*img)->w = w;
    (*img)->h = h;

    // 分配像素内存
    (*img)->pixels = malloc(sizeof(uint32_t) * w * h);
    if ((*img)->pixels == NULL) {
        perror("malloc for pixels failed");
        free(*img); // 结构体已分配,需先释放避免内存泄漏
        exit(EXIT_FAILURE);
    }

    for (int x = 0; x < w; x++)
        for (int y = 0; y < h; y++)
            (*img)->pixels[y * w + x] = 0xFF000000;
}

Image* create_img(uint16_t w, uint16_t h)
{
    Image* img = NULL; // 初始为NULL的指针
    gen_img(&img, w, h);
    return img;
}

int main(void)
{
    Image* img = create_img(32, 32);

    for (int x = 0; x < img->w; x++)
        for (int y = 0; y < img->h; y++)
            printf("%x\n", img->pixels[y * img->w + x]);

    free(img->pixels);
    free(img);
    return 0;
}

关键说明

C语言采用值传递,如果直接传递一级指针给函数,函数内部修改的只是指针的副本,外部指针不会受到影响。只有传递二级指针(指针的指针),才能让函数内部修改外部指针的实际指向——这也是你场景中使用二级指针的核心意义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:45:56