C语言结构体与指针代码编译错误排查及修正方法
C语言结构体指针代码编译错误修复
问题定位
- 语法错误:结构体类型定义处存在关键字拼写错误,标准C语言类型定义关键字为
typedef,原代码写为typedf(缺失字母e),编译器无法识别该标识,是编译失败的直接原因。 - 规范问题:原代码对
malloc申请的堆内存未做释放处理,存在内存泄漏风险;C语言环境下malloc返回的void*类型可隐式转换为对应结构体指针,无需强制类型转换,原代码的强转写法无语法错误但属于冗余写法。 - 逻辑验证:原代码中除上述拼写错误外,其余指针偏移、二级指针解引用、结构体成员访问的逻辑均符合C语言语法规则,不存在语法层面的问题。
修正后可正常编译运行的代码
#include <stdio.h> #include <stdlib.h> // 修正typedef关键字拼写 typedef struct { int a; int b; } STR; int main(void) { STR *arr[4]; STR **ptr = arr; for(int i = 0; i < 4; i++) { arr[i] = malloc(sizeof(STR)); (*arr[i]).a = i + 7; (**(ptr + i)).b = i + 3; } printf("%d\n", ptr[2]->a); printf("%d", (*(arr + 3))->b); // 补充堆内存释放逻辑,避免内存泄漏 for(int i = 0; i < 4; i++) { free(arr[i]); } return 0; }
运行结果
代码执行后输出如下:
9 6
注:如果使用C89标准编译,需要把
for循环中声明的int i提前到函数开头位置;C99及之后的标准支持在for循环初始化块内声明变量,可直接编译通过。
内容的提问来源于stack exchange,提问作者SOooo
相关产品推荐
相关产品推荐

