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

获取数组元素地址及数组反转赋值失败问题求助

问题分析与解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:35:07