如何在C语言中为不同类型变量分配并访问内存(不使用结构体)
C语言自定义内存布局的赋值与访问问题解决
你当前代码的核心问题是所有指针都指向同一块内存的起始地址,不管是key、name还是age,甚至key2、name2、age2都盯着同一块地址写,后面的赋值自然会把前面的覆盖掉。而且你也没给20个元素各自分配独立的12字节空间,相当于一直在同一块12字节区域里反复覆盖。
要实现每个元素占12字节(key[4] + name[4] + age[4])、共20个元素的布局,需要给每个元素计算正确的内存偏移,具体代码如下:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #define ELEM_SIZE 12 // 每个元素固定12字节 #define ELEM_COUNT 20 // 共20个元素 int main() { // 分配总内存:20*12字节,用char*方便按字节偏移计算 char* table = (char*)malloc(ELEM_SIZE * ELEM_COUNT); if (!table) { perror("malloc failed"); return 1; } // 操作第0个元素 char* key0 = table + 0*ELEM_SIZE; // 第0个元素的key起始地址 char* name0 = key0 + 4; // key占4字节,name往后偏移4字节 int* age0 = (int*)(name0 + 4); // name占4字节,age往后偏移4字节 key0[0] = 'c'; key0[1] = 'i'; key0[2] = 'r'; key0[3] = '\0'; // 可选,方便作为字符串打印 name0[0] = 'p'; name0[1] = 'a'; name0[2] = 'v'; name0[3] = '\0'; *age0 = 15; // 操作第1个元素 char* key1 = table + 1*ELEM_SIZE; char* name1 = key1 + 4; int* age1 = (int*)(name1 + 4); key1[0] = 'r'; key1[1] = 'i'; key1[2] = 'c'; key1[3] = '\0'; name1[0] = 'v'; name1[1] = 'a'; name1[2] = 'p'; name1[3] = '\0'; *age1 = 12; // 验证访问 printf("第0个元素:key=%s, name=%s, age=%d\n", key0, name0, *age0); printf("第1个元素:key=%s, name=%s, age=%d\n", key1, name1, *age1); // 也可以直接通过偏移访问任意元素,比如第5个元素的age int* age5 = (int*)(table + 5*ELEM_SIZE + 8); // 5*12是第5个元素起始,+8跳过key和name的8字节 *age5 = 25; printf("第5个元素的age=%d\n", *age5); free(table); return 0; }
关键要点说明
- 用
char*作为总内存的指针,方便按字节计算偏移,避免不同类型指针步长不同的问题 - 每个元素的起始地址是
table + n*ELEM_SIZE,n是元素索引(从0到19) - 每个元素内部:
- key从元素起始地址开始,占前4字节
- name从key的地址+4字节开始,占接下来4字节
- age从name的地址+4字节开始,占最后4字节(注意强制转成
int*,因为age是4字节整数)
- 给字符串末尾加
'\0'是为了能直接用printf("%s")打印,如果你不需要作为字符串使用,可以省略
内容的提问来源于stack exchange,提问作者R.Duarte
相关产品推荐
相关产品推荐

