calloc在char数组中返回2个字符

时间:2013-08-26 06:02:01

标签: c gcc

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

5 个答案:

答案 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)释放它。

基本上,我想说的是你要打印的东西是无法打印的。