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
相关产品推荐
相关产品推荐

