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

C语言结构体指针成员问题:为何整型指针代码无法运行?

嘿,我来帮你把这两段代码的问题拆解清楚,核心原因是你对指针的赋值逻辑完全搞错了,先看两段代码的对比,再讲具体原因:

第一个可正常运行的代码(char*版本)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
    struct machine {
        char *memory;
    };
    struct machine CPUtype;
    struct machine *mpu641;
    CPUtype.memory="QWERTY";
    mpu641=&CPUtype;
    printf("The value is %s\n",mpu641->memory);
    return 0;
}

第二个无法运行的代码(int*版本)

int main() {
    struct machine {
        int *memory;
    };
    struct machine CPUtype;
    struct machine *mpu641;
    CPUtype.memory=5;
    mpu641=&CPUtype;
    printf("The value is %d\n",mpu641->memory);
    return 0;
}

核心差异与失效原因

1. 第一个代码为什么能正常运行?

  • "QWERTY"是字符串常量,在程序编译时会被存储到进程的只读数据段中,它本身是一个char[]类型的数组,会被隐式转换为指向数组首元素的char*指针(也就是这个字符串在内存中的合法地址)。
  • 你把这个合法地址赋值给CPUtype.memory(char*类型),后续通过mpu641->memory访问这个地址,自然能正常读取到字符串内容,所以printf用%s打印完全没问题。

2. 第二个代码为什么失效?

这里有两个致命问题:

  • 指针赋值逻辑错误:CPUtype.memory=5; 是把整数5直接赋值给int*类型的指针变量。在C语言中,这相当于让这个指针指向内存地址为5的位置——而这个地址在几乎所有现代操作系统中都是无效的(低地址通常是内核保留区或未映射的内存,用户程序没有访问权限)。
  • printf格式符不匹配:你用%d去打印mpu641->memory,而它的类型是int*(指针类型)。在64位系统中,指针是8字节,int是4字节,类型不匹配会导致未定义行为;即使是32位系统,这也不是正确的用法。

如果你想让第二个代码正常运行,正确的写法可以二选一:

  • 让指针指向一个已存在的int变量:
    int main() {
        struct machine {
            int *memory;
        };
        struct machine CPUtype;
        struct machine *mpu641;
        int val = 5; // 定义一个int变量
        CPUtype.memory = &val; // 让指针指向这个变量的地址
        mpu641 = &CPUtype;
        printf("The value is %d\n", *mpu641->memory); // 解引用指针获取值
        return 0;
    }
    
  • 或者给指针动态分配内存:
    #include<stdlib.h> // 需要stdlib.h用于malloc
    int main() {
        struct machine {
            int *memory;
        };
        struct machine CPUtype;
        struct machine *mpu641;
        CPUtype.memory = malloc(sizeof(int)); // 分配一个int大小的内存
        if (CPUtype.memory == NULL) { // 检查分配是否成功
            printf("malloc failed\n");
            return 1;
        }
        *CPUtype.memory = 5; // 给分配的内存赋值
        mpu641 = &CPUtype;
        printf("The value is %d\n", *mpu641->memory); // 解引用获取值
        free(CPUtype.memory); // 释放动态分配的内存
        return 0;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:21