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

使用C语言calloc函数后,打印指针与数组元素结果不符的原因咨询

问题分析与解决

1. 指针打印格式错误导致的奇怪数值

你用%d打印指针array是错误的。%d是用来输出int类型数据的,而指针(int*)的大小在64位系统中是8字节,int通常是4字节,用%d打印指针会导致地址被截断或符号扩展,所以才会出现-1300734400这种奇怪的负数。

正确的指针打印方式是用%p格式符,并且要把指针强制转换为void*:

printf("%p\n", (void*)array);

这样会输出内存地址的标准十六进制形式,比如0x55a123456780。

2. 为什么指针不是0?

只有当calloc分配内存失败时,才会返回NULL(也就是数值0)。你的代码里calloc成功分配了内存,所以返回的是这块内存的起始地址,自然不是0。循环打印元素都是0,正好验证了calloc的作用——它会把分配的内存初始化为0。

3. 循环次数错误

你的循环条件i < sizeof(array)是错的。sizeof(array)计算的是指针变量本身的大小(64位系统是8字节,32位是4字节),不是你分配的数组元素个数。所以你只打印了前8个元素,而不是你预期的100个。

要遍历全部100个元素,应该直接用100作为循环上限,或者定义一个变量保存元素数量:

// 方式1:直接用100
for(int i = 0; i < 100; i++)
{
    printf("%d\n", array[i]);
}

// 方式2:用变量保存元素数,更灵活
int count = 100;
array = calloc(count, sizeof(int));
for(int i = 0; i < count; i++)
{
    printf("%d\n", array[i]);
}

修正后的完整代码

#include "stdio.h"
#include "stdlib.h"

int main()
{
    int *array;
    int elem_count = 100;
    // 检查calloc是否成功
    array = calloc(elem_count, sizeof(int));
    if(array == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    // 正确打印指针地址
    printf("指针地址:%p\n", (void*)array);
    // 遍历全部100个元素
    for(int i = 0 ; i < elem_count; i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    } 
    free(array);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:08:18