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

C语言自定义push函数返回的指针为何无法用[]语法正确取值?

核心问题原因

你的问题是两个低级错误叠加导致的巧合现象:

  • 第一个错误:sizeof(myNums)获取的是数组总字节数而非元素个数。你定义的myNums包含3个int元素,假设int占4字节,sizeof(myNums)的结果是12,而非你预期的3。调用push函数时你把12作为size参数传入,因此push内部会申请13个int的空间,拷贝12次数据(原数组只有3个有效元素,后续拷贝的都是栈上的垃圾值),最后把新增的4存在arr2[12]的位置,自然无法通过p[3]读取到4。
  • 第二个错误:你混淆了指针运算的优先级。(*p + 3)的实际执行逻辑是先取p指向的第一个元素的值,再加3,你原数组第一个元素是1,1+3=4刚好和你想push的数值巧合一致,才让你误以为这个写法是对的,它本质上完全不是访问数组第4个元素的逻辑,正确的写法应该是*(p + 3)才等价于p[3]。
代码修复方案

第一版问题代码修复

调用push时传入正确的元素个数即可:

// 把sizeof(myNums)改为总字节数除以单个元素的字节数,得到元素个数
int *p = push(myNums, sizeof(myNums)/sizeof(myNums[0]), 4);
// 此时p[3]就可以正确读到4,你之前写的(*p+3)只是巧合得到正确值的错误写法

同时注意C语言中堆分配的内存需要手动free,避免内存泄漏。

结构体版本代码修复

你的结构体实现思路是对的,但缺少初始化逻辑,直接操作野指针属于未定义行为,需要初始化intArray变量:

int main(int argc, char *argv[]) {
    // 初始化:指针设为NULL,长度设为0,realloc支持传入NULL作为参数
    intArray myNums = {.values = NULL, .length = 0};
    myNums = push(&myNums,15);
    myNums = push(&myNums,30);
    myNums = push(&myNums,45);
    myNums = push(&myNums,60);
    myNums = pop(&myNums);

    printInts(&myNums);
    
    // 用完释放内存
    free(myNums.values);
    return 0;
}

另外pop操作需要做边界判断,避免length减到负数导致realloc申请异常大小的内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:06:03