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

不使用箭头运算符,通过指针访问结构体中数组的方法

问题分析与解决

代码核心错误

  • 指针类型完全不匹配:struct dog **ptr=&frodo.name; 是严重错误。frodo.name 是int[10]类型,它的地址本质是int*(指向int的指针),而struct dog**是指向结构体指针的指针,两者类型完全不兼容,强制赋值会导致内存访问逻辑混乱,这就是输出不符合预期的根本原因。
  • 错误的指针访问逻辑:即便类型匹配,ptr[i]的访问逻辑也不适用——双重指针的索引是针对指针数组的,而你要访问的是结构体中的int数组,两者逻辑完全不同。

正确实现方式(不使用箭头运算符)

以下两种方法都能满足需求,且避免类型错误:

方法1:通过结构体指针解引用访问数组

#include <stdio.h>

struct dog
{
    int name[10];
    char breed[10];
    int age;
    char color[10];
};

int main()
{
    struct dog frodo;
    // 定义指向结构体的指针,绑定到frodo
    struct dog *ptr = &frodo;

    // 初始化name数组
    for(int i=0;i<10;i++)
        frodo.name[i] = i;

    // 直接访问原数组
    for(int i=0;i<10;i++)
        printf(" frodo.name[%d] = %d\n",i,frodo.name[i]);

    // 不使用箭头运算符,通过(*ptr)解引用结构体后访问数组
    for(int i=0;i<10;i++)
        printf(" ptr访问: %d\n", (*ptr).name[i]);
}

方法2:直接用指向数组的指针访问

如果只需要单独访问结构体里的name数组,可以直接定义指向该数组的指针:

#include <stdio.h>

struct dog
{
    int name[10];
    char breed[10];
    int age;
    char color[10];
};

int main()
{
    struct dog frodo;
    // 直接指向name数组,数组名会隐式转换为指向首元素的指针
    int *name_ptr = frodo.name;

    // 初始化数组
    for(int i=0;i<10;i++)
        frodo.name[i] = i;

    // 直接访问原数组
    for(int i=0;i<10;i++)
        printf(" frodo.name[%d] = %d\n",i,frodo.name[i]);

    // 通过数组指针访问元素
    for(int i=0;i<10;i++)
        printf(" ptr访问: %d\n", name_ptr[i]);
}

运行说明

两种方法都能正确输出0~9的数值,核心是保证指针类型与目标内存的类型完全匹配,避免类型不匹配导致的内存访问错误。

内容的提问来源于stack exchange,提问作者slayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:01:08