重拾C语言技能时遇到结构体中数组指针的技术问题求助
解决结构体中数组指针的赋值问题
嘿,我来帮你理清这个C语言结构体指针的坑!你的问题核心在于没搞清楚值拷贝和指针引用的区别,还有指针类型的匹配问题,咱们一步步拆解:
为什么修改a3后打印还是3?
你写的b_imp->ptr[b_imp->iter++] = *a_array[i];这行代码,本质是做了值拷贝:
*a_array[i]是取a_array[i]指向的变量的当前值(比如a3的初始值3)- 然后把这个值复制到
b_imp->ptr指向的数组对应的位置里
这就像你把文件复制了一份存在另一个文件夹,原文件改内容,副本不会跟着变。所以之后你把a3改成5,ptr里存的还是之前拷贝的3,打印自然还是3。
为什么*b_imp->ptr[b_imp->iter++] = a_array[i];会报错?
这个错误是因为类型不匹配:
- 假设你的结构体里
ptr是int*类型(指向int的指针),那b_imp->ptr[b_imp->iter++]其实是一个int类型的变量(数组的元素) - 你试图对一个
int变量用解引用运算符*,这当然不行——解引用只能用在指针类型上,所以编译器会提示“pointer type required”。
正确的实现方式
先明确你的需求:如果想让结构体里的指针能跟踪原变量的变化(改a3后打印5),那结构体里的ptr得定义成指向指针的指针(int**),也就是用来存储指针的数组。
给你写个完整的示例代码,一看就懂:
#include <stdio.h> #include <stdlib.h> // 调整结构体的ptr类型为int** typedef struct { int **ptr; int iter; } MyImplementation; int main() { int a1 = 1, a2 = 2, a3 = 3; // a_array是指针数组,每个元素指向int变量 int *a_array[] = {&a1, &a2, &a3}; MyImplementation b_imp; b_imp.iter = 0; // 分配内存:存储3个int*指针的空间 b_imp.ptr = (int**)malloc(3 * sizeof(int*)); if (b_imp.ptr == NULL) { perror("malloc failed"); return 1; } // 直接存储指针,而不是值! b_imp.ptr[b_imp.iter++] = a_array[2]; // 把&a3的地址存进去 // 修改原变量的值 a3 = 5; // 访问时需要解引用两次:ptr[0]是&a3,*ptr[0]就是a3的当前值 printf("%d\n", *b_imp.ptr[0]); // 现在会打印5啦! // 别忘了释放分配的内存 free(b_imp.ptr); return 0; }
关键要点总结
- 先明确需求:
- 要是只需要存固定值:用
int* ptr,赋值用ptr[i] = *a_array[j];,原变量修改不影响这里 - 要跟踪原变量的变化:用
int** ptr,赋值用ptr[i] = a_array[j];,访问时用*ptr[i]取最新值
- 要是只需要存固定值:用
- 注意运算符优先级:
[]比*优先级高,所以*b_imp->ptr[i]等价于*(b_imp->ptr[i]),这才是正确的解引用顺序
内容的提问来源于stack exchange,提问作者Benjamin Larsen
相关产品推荐
相关产品推荐

