使用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
相关产品推荐
相关产品推荐

