如何比较两个动态分配数组的内存位置?
互为副本的动态数组内存位置比较方法
核心逻辑
两个动态指针foo和bar自身存储的就是各自指向堆内存块的起始地址,要对比两块内存的实际位置,直接比较两个指针变量存的地址值即可,完全不需要解引用读取数组内部的元素做对比。
具体操作
- 直接使用相等、不等运算符对比两个指针的值,也就是写
foo == bar、foo != bar即可:- 返回真时,代表两个指针指向完全重叠的同一块内存
- 返回假时,代表两个指针指向两块完全独立的堆内存——哪怕两块内存里存的数组元素完全一致(也就是题目说的互为副本),地址值也不会相等
- 明确比较的合法边界:跨独立分配的内存块,只允许用
==/!=做相等性判断;如果要通过大小比较符(</>/<=/>=)判断谁的地址位置更高,只有当两个指针属于同一块连续分配的内存范围时,才是C语言标准支持的合法行为。对两次独立malloc得到的、分属不同块的指针做大小比较,属于标准定义的未定义行为,可能在编译器优化下出现非预期结果。
常见混淆点
- 别把“比较内存位置”和“比较数组内容”搞混:逐元素遍历对比、
memcmp这类操作是用来判断两个数组存的数值是不是完全一致的,和内存位置是否重叠没有任何关系。题目里提到的“互为副本”的场景,恰恰就是内容完全相同、但内存位置完全独立的典型情况。 - 别错对比指针变量本身的栈上地址(也就是
&foo和&bar):这两个值是foo、bar这两个局部变量在程序栈区的存储位置,和它们指向的动态数组所在的堆内存位置没有任何关联,拿这俩值比完全没有意义。
实际示例代码
// 申请两块独立的动态内存 int* foo = malloc(10 * sizeof(int)); int* bar = malloc(10 * sizeof(int)); // 将bar的内容复制为foo的完全副本 memcpy(bar, foo, 10 * sizeof(int)); // 对比两个数组的内存位置 if (foo == bar) { printf("两个数组指向同一块内存\n"); } else { printf("两个数组是位置完全独立的内存块\n"); }
补充说明:如果两个数组的副本关系是通过直接复制指针得到的(比如
bar = foo),那二者的地址值会完全相等;但如果是申请了新内存空间、逐值复制得到的内容副本,二者的地址值必然是相互独立的。
内容的提问来源于stack exchange,提问作者hilena
相关产品推荐
相关产品推荐

