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

C语言禁用malloc时,如何创建结构体指针数组并进行值的输入输出

结构体指针数组的正确实现(无malloc版本)

你的代码存在几个语法和逻辑错误,下面逐个修正并给出正确实现:

原代码的核心问题

  • 结构体定义末尾的a和b是多余的全局实例,会和结构体类型名冲突,应该删除。
  • 不能直接用结构体初始化列表给指针赋值:struct a * valueA = {1, 2};是错误的,指针需要指向一个已存在的struct a实例,而非直接用数值初始化。
  • 同理,listOfB[0] = {valueA, 1, 2};也是错误的,数组里的struct b*指针需要指向一个已存在的struct b实例,不能直接用初始化列表赋值。

正确实现代码

因为不能使用malloc,我们可以用栈上实例或者全局/静态实例分配结构体内存,再让指针数组指向这些实例:

#include <stdio.h>

// 修正结构体定义:去掉末尾多余的实例名
struct a {
    int val1;
    int val2;
};

struct b {
   struct a * next;
   int val1;
   int val2;
};

// 定义struct b指针数组,长度为3
struct b * listOfB[3];

int main() {
    // 1. 创建栈上的struct a实例,再让指针指向它
    struct a valueA = {1, 2};
    struct a * ptrA = &valueA;

    // 2. 创建栈上的struct b实例,初始化成员
    struct b instanceB0 = {ptrA, 1, 2};
    // 让指针数组的第一个元素指向这个实例
    listOfB[0] = &instanceB0;

    // 3. 访问并打印值
    printf("%d\n", listOfB[0]->next->val1); // 输出1

    // 可以继续创建其他实例填充数组
    struct a valueA1 = {3, 4};
    struct b instanceB1 = {&valueA1, 5, 6};
    listOfB[1] = &instanceB1;
    printf("%d\n", listOfB[1]->val2); // 输出6

    return 0;
}

注意事项

  • 如果需要指针数组的元素在main函数外也能访问,不要用栈上实例(栈内存会在函数返回后释放),应该改用全局实例或者静态局部实例(比如static struct b instanceB0 = {...};)。
  • 初始化结构体时,要保证每个指针成员都指向有效的、生命周期足够长的实例,避免出现野指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:54:20