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
相关产品推荐
相关产品推荐

