C语言使用malloc、realloc动态内存分配时指针大小不变原因咨询
问题原因
- 你对
sizeof运算符的作用存在误解:sizeof计算的是变量本身占用的内存大小,你代码里的ptr是int*类型的指针变量,所以sizeof(ptr)得到的是指针本身的大小,和它指向的动态内存块大小没有任何关联。 - 指针变量的大小仅由程序运行的系统架构决定:64位系统下所有类型的指针大小都是8字节,32位系统下为4字节,所以无论你用
malloc申请多大的内存、后续是否用realloc扩容,打印的sizeof(ptr)结果都不会变。 - 补充说明:C语言标准没有提供原生接口可以直接获取动态分配内存块的总大小,如果需要用到申请的内存容量,需要你自己额外定义变量存储申请的字节数或者元素个数。
参考修正代码
如果要正确打印你申请的动态内存大小,可以参考如下写法:
int *ptr; // 自定义变量存储申请的元素个数,同步维护即可 size_t arr_len = 5; ptr = (int*)malloc(arr_len * sizeof(int)); printf("current size is %ld\n", arr_len * sizeof(int)); for (int i = 0; i < 5 ; i++) { ptr[i] = i + 1; } for (int i = 0; i < 5 ; i++) { printf("%d\n",*(ptr + i)); } // 扩容时同步更新长度变量 arr_len = 10; ptr = (int*)realloc(ptr, arr_len * sizeof(int)); printf("new size is %ld\n", arr_len * sizeof(int)); for (int i = 0; i < 5 ; i++) { printf("%d\n", *(ptr + i)); }
内容的提问来源于stack exchange,提问作者Themisba7
相关产品推荐
相关产品推荐

