gcc(GCC)4.4.6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct B {
int i;
char *p;
} B_t;
B_t b = {
.i = 10,
.p = NULL
};
int main(int argc, char *argv[])
{
struct B *ptr;
ptr = &b;
ptr->p = (char *) calloc(ptr->i, sizeof(char));
printf("%d,%lu,%lu\n", ptr->i, sizeof(ptr->p), sizeof((ptr->p)[0]));
return 0;
}
$ make
gcc -g -Wall -o test test.c
$ ./test
10,8,1
为什么?我期待10,10,1
答案 0 :(得分:3)
p
是指向char
的指针。应用于指针时,sizeof()
运算符将返回指针中的字节数,而不是为指向的对象分配的内存量。在你的系统上,指针的大小是8个字节,所以你看到8。
答案 1 :(得分:1)
首先,sizeof
在编译时工作(可变长度数组除外)。
其次,sizeof(ptr->p)
返回p
的大小,这是一个指针,而不是指针指向的大小。在64位计算机中,指针的大小通常为8
。
答案 2 :(得分:0)
执行sizeof(ptr->p)
时,您询问指针的大小,而不是分配的内存段的大小。由于sizeof
运算符是在编译时计算的,因此您无法使用它来了解已动态分配了多少内存。
看起来你有一个64位系统,所以你的指针是8个字节。
答案 3 :(得分:0)
sizeof(ptr->p)
返回char *
指针变量的大小,以字节为单位,在64位计算机上为8 bytes
。
sizeof()
不会使用malloc()
,calloc()
或其他分配函数返回您分配给它的内存量。
答案 4 :(得分:0)
你不能使用sizeof()或任何其他简单方法打印calloc'ed或malloc内存的大小,你必须自己跟踪所有动态分配的内存,而你之后应该使用free(ptr_to_allocated_mem)
释放它。