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

能否对内存地址做算术运算?如何通过地址计算数组大小?

关于数组大小计算的问题解答

首先,先指出你代码里的几个明显问题:

  • 第一个main函数里的数组定义int arr[] = {1,2,3}末尾缺少分号,会直接导致编译错误。
  • C标准规定main函数的合法签名是int main(void)或者int main(int argc, char *argv[]),你写的void main(int* a,int n)不符合标准,建议修正。
  • 你代码里的int size = (a-(&a[0]))/4;逻辑完全错误:a是指针变量,循环中已经被多次自增,此时&a[0]等价于当前的a指针本身,所以a - &a[0]的结果永远是0,根本无法计算数组大小。

接下来回答你的核心疑问:能不能通过「(指针地址差)/sizeof(int)」的方式计算数组元素个数?

答案是:不推荐用强制转换地址为整数再计算的方式,但正确使用指针减法可以直接得到元素个数——而且比你想的更简单。

正确的指针减法逻辑

在C语言中,两个指向**同一数组(或同一数组末尾之后的位置)**的同类型指针相减,结果直接是两者之间的元素个数差,而非字节数。比如:

void some_func(int* a, int n) {
    int* start = a; // 先保存数组首地址
    for(int i=0; i<n; i++) {
        a++;
    }
    int size = a - start; // 直接得到元素个数,这里结果就是n
}

像你举的例子:首元素地址是4(假设int为4字节),循环后指针指向16,那么a - start的结果就是(16-4)/4 = 3,这个计算是编译器自动完成的,不需要你手动除以4。

为什么不建议强制转换指针为整数计算?

  1. 未定义行为:C标准没有规定指针可以安全转换为int类型,在64位系统中,指针是8字节,int通常是4字节,强制转换会丢失高位地址信息,导致计算错误。
  2. 不必要:指针减法已经帮你处理了类型的字节大小,手动计算反而容易出错(比如换了平台,int的字节数变化后,代码直接失效)。

额外提醒

你第二个main函数里已经传入了n参数,这本身就是数组的大小,完全没必要再重复计算,属于冗余操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:55:12