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

如何让C语言中两个数组占用同一块内存区域?

让两个数组类结构指向同一内存区域的实现方案

首先纠正一个常见误区:C语言中的数组实际上是常量指针。 正确的表述是:数组首元素的指针是常量。这意味着我们无法直接为指向数组首元素的指针赋值新地址,但在某些场景下,我们需要让两个类似数组的结构指向同一块内存,比如想实现下面这种直接关联的效果:

int a[10];
int b[10];

a = b; // 该行代码无法编译通过

你已经给出了一个可行的指针方案:

int *a;
int *b;
int c[10];

a = c;  // 修改a指向的内容时
b = c;  // b指向的内容会同步变化

a[2] = 5;
printf("Output is %d", b[2]);

>> Output is 5

除此之外,还有以下几种替代方案:

1. 宏定义数组别名

通过预处理阶段的宏替换,让多个标识符指向同一个数组:

#define a c
#define b c
int c[10];

a[2] = 5;
printf("Output is %d", b[2]);
// 输出结果:5

注意:宏是纯文本替换,编译后a和b都会被替换成c,不存在独立的a或b标识符,无法单独修改它们的指向。

2. 结构体包裹指针或数组

方案A:结构体指针共享数组

把数组放进结构体,通过结构体指针指向同一个结构体实例,实现内存共享:

typedef struct {
    int arr[10];
} IntArray10;

IntArray10 c;
IntArray10 *a = &c;
IntArray10 *b = &c;

a->arr[2] = 5;
printf("Output is %d", b->arr[2]);
// 输出结果:5

方案B:结构体包含指针成员

让结构体的指针成员指向同一个数组:

typedef struct {
    int *ptr;
    int length; // 可额外封装数组长度信息
} ArrayWrapper;

int c[10];
ArrayWrapper a, b;
a.ptr = c;
a.length = 10;
b.ptr = c;
b.length = 10;

a.ptr[2] = 5;
printf("Output is %d", b.ptr[2]);
// 输出结果:5

这种方式更灵活,还能封装数组长度等额外信息,适合复杂场景。

方案对比

  • 指针方案:最灵活,可随时修改指针指向,但需要注意避免野指针问题。
  • 宏别名方案:语法简单,使用起来和原生数组一致,但无法独立修改指向,扩展性差。
  • 结构体方案:可封装更多信息,代码可读性更高,适合需要结构化管理数组的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:15:32