获取数组元素地址及数组反转赋值失败问题求助
问题分析与解决
1. 代码中的低级错误
你写的代码里有个明显的变量名拼写错误:revName应该是revNames,这会直接导致编译或运行报错,先把这个修正。
2. 两种实现思路:复制元素 vs 保存元素地址
你混淆了复制结构体元素和保存结构体元素地址两种逻辑,下面分别说明:
思路一:复制结构体元素(原代码的意图)
如果要把原数组的结构体元素完整复制到新数组(反转顺序),修正变量名后的代码是可以正常工作的:
struct s_name { char *name; int age; }; // 内存分配与初始化 s_name *allNames; int maxNames = 10; allNames = malloc(sizeof(s_name) * maxNames); // 假设已完成原数组元素赋值,比如 allNames[9].name = "Bob" // 反转复制逻辑 s_name *revNames = malloc(sizeof(s_name) * maxNames); int revIndex = 0; for (int i = maxNames - 1; i >= 0; i--, revIndex++) { revNames[revIndex] = allNames[i]; // 直接复制结构体 } // 此时可正常访问:revNames[0].name 等价于 allNames[9].name
注意:这里复制的是结构体本身,包括内部的char *name指针——也就是说revNames[0].name和allNames[9].name指向同一块内存,若后续释放原数组的name内存,反转数组的name会变成野指针,需留意这一点。
思路二:保存原数组元素的地址(你想实现的指针保存逻辑)
如果不想复制结构体,只想让反转数组的元素是原数组元素的地址(即反转数组是一个指针数组),需要修改revNames的类型为s_name **:
// 内存分配:数组每个元素是指向s_name的指针 s_name **revNames = malloc(sizeof(s_name *) * maxNames); int revIndex = 0; for (int i = maxNames - 1; i >= 0; i--, revIndex++) { revNames[revIndex] = &allNames[i]; // 取原数组元素的地址赋值 } // 访问时需用->,因为revNames[0]是指针 printf("%s", revNames[0]->name); // 等价于 allNames[maxNames-1].name
这种方式没有复制结构体,仅保存原元素地址,节省内存,但原数组不能提前释放,否则反转数组内的所有指针都会变成野指针。
3. 指针算术概念澄清
allNames是指向数组首元素的指针,allNames[i]等价于*(allNames + i),即取首地址偏移i * sizeof(s_name)位置的结构体元素。&allNames[i]等价于allNames + i,即该元素的地址,类型为s_name *。- 若要保存这些地址,数组的元素类型必须是
s_name *,因此数组整体类型为s_name **(指向指针的指针)。
内容的提问来源于stack exchange,提问作者Big Guy
相关产品推荐
相关产品推荐

