【发布时间】:2021-11-16 21:47:58
【问题描述】:
我试图理解动态内存分配的概念。我想知道分配内存后大小的变化是什么。
我的代码如下。
#include <stdio.h>
#include <stdlib.h>
int main(){
char *s;
printf("Size before malloc: %d\n", sizeof(s));
s = (char*)malloc(1024 * sizeof(char));
printf("Size after malloc: %d\n", sizeof(s));
printf("Size actual: %d\n", sizeof(s) * 1024);
s[0] = 'a';
s[1] = 'b';
s[2] = 'c';
s[3] = 'd';
printf("Size by calculation: %d", sizeof(s) / sizeof(char));
return 0;
}
当我执行这段代码时,我得到如下输出。
Size before malloc: 8
Size after malloc: 8
Size actual: 8192
Size by calculation: 8
那么为什么在分配内存后不返回 8192 作为大小。此外,当我将字符添加到 s 时,为什么不得到 4 ?
【问题讨论】:
-
欢迎来到 SO。
s是一个指针。给指针赋值不会改变它的类型或大小。它始终是一个指针,并且具有指针的大小。无法获取s指向的分配内存的大小。大小由您决定。 -
我明白了,谢谢。有没有办法跟踪大小?例如,我可以在后面的代码中获得其余的尺寸吗?
-
%dprintf格式说明符错误。sizeof运算符的结果是数据类型size_t,而不是int。size_t的正确格式说明符是%zu。格式说明符%d可能适用于大多数 32 位平台,但我不确定它是否适用于 64 位平台。为了在所有平台上都安全,您应该始终使用正确的格式说明符。 -
短语实际大小最好表述为分配的内存。
-
"有没有办法跟踪大小?"使用变量!
size_t size = 1024; char *s = malloc(size); /* ... 42 lines later ... */ printf("allocated %zu bytes for s.\n", size);