-1

海合会 (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

4

5 回答 5

3

p是指向 的指针char。应用于指针的sizeof()运算符将返回指针中的字节数,而不是为指向的对象分配的内存量。在您的系统上,指针的大小是 8 个字节,所以您看到的是 8。

于 2013-08-26T06:04:53.433 回答
1

首先,sizeof在编译时工作(可变长度数组除外)。

其次,sizeof(ptr->p)返回的是指针的大小,p而不是指针指向的内容。在 64 位机器中,指针的大小通常为8.

于 2013-08-26T06:06:33.990 回答
0

不能使用 sizeof() 或任何其他简单方法打印 calloc'ed 或 malloc'ed 内存的大小,您必须自己跟踪所有动态分配的内存,稍后您应该使用free(ptr_to_allocated_mem).

基本上,我想说的是您要打印的内容无法打印。

于 2013-08-26T08:07:31.520 回答
0

当您这样做时,sizeof(ptr->p)您询问的是指针的大小,而不是分配的内存段的大小。由于该sizeof运算符是在编译时计算的,因此您无法使用它来了解动态分配了多少内存。

看起来你有一个 64 位系统,所以你的指针是 8 个字节。

于 2013-08-26T06:05:09.807 回答
0

sizeof(ptr->p)返回64 位计算机上char *指针变量的大小(以字节为单位) 。8 bytes

sizeof()不会返回您使用 或其他分配函数分配给它的内存malloc()calloc()

于 2013-08-26T06:05:29.443 回答