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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:35