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

C语言copy函数动态内存拷贝整数结果异常问题咨询

错误根因

核心问题出在(int *)a++;语句的运算符优先级和void指针运算规则上:

  • 后缀自增运算符++的优先级高于强制类型转换操作,因此(int *)a++的实际执行逻辑是:先对原void*类型的a做后缀自增,再将自增前的a值强转为int*——这个强转结果是临时右值,没有被任何变量接收,等于强转完全没有生效。
  • C标准不允许直接对void*类型指针做算术运算,因为void无具体类型,编译器无法确定指针移动的步长。多数编译器(如GCC)会默认将void*的算术运算步长设为1字节,因此这里每次a++仅向后偏移1字节,而非一个int类型对应的4字节(32/64位系统通用int长度)。
  • 源指针每次只偏移1字节,读取int值时就会出现内存错位:小端序下数组[0,1,2,...9]的内存按字节排布为00 00 00 00 01 00 00 00 02 00 00 00...,偏移1字节读取4字节得到00 00 00 01即十进制16777216,偏移2字节读取得到00 00 01 00即十进制65536,和你输出的异常值完全吻合。

替换为a=(int *)a+1;后逻辑正常的原因:
这行语句先将a强转为int*类型,指针偏移的步长变为sizeof(int)(即4字节),偏移后再赋值回a,每次正好移动到下一个int元素的起始位置,拷贝逻辑符合预期。

代码中其他潜在问题
  • copy函数首行int *t=(int *)calloc(1,sizeof(int));属于无意义操作,后续直接将t赋值为glob_var的地址,这块申请的内存无法被释放,会造成内存泄漏。
  • 全局变量glob_var和copy函数内部定义的局部glob_var同名,函数内部操作的始终是局部变量,容易引发变量遮蔽导致的逻辑错误,不建议这种写法。
  • copy函数内打印拷贝结果的循环硬编码长度为10,没有使用传入的size参数,当传入长度不是10时会出现内存越界访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:57:16