Usando sizeof com um array dinamicamente alocado

gcc 4.4.1 c89

Eu tenho o seguinte trecho de código:

#include  #include  char *buffer = malloc(10240); /* Check for memory error */ if(!buffer) { fprintf(stderr, "Memory error\n"); return 1; } printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

No entanto, o sizeof (buffer) sempre imprime 4. Eu sei que um char * é de apenas 4 bytes. No entanto, aloquei a memory para 10kb. Então, o tamanho não deveria ser 10240? Eu estou querendo saber eu estou pensando bem aqui?

Muito obrigado por todas as sugestões,

Você está pedindo o tamanho de um char* que é de fato 4, não o tamanho do buffer. O operador sizeof não pode retornar o tamanho de um buffer alocado dinamicamente, apenas o tamanho de tipos e estruturas estáticos conhecidos no momento da compilation.

sizeof não funciona em alocações dinâmicas (com algumas exceções em C99). Seu uso de sizeof aqui é apenas dando-lhe o tamanho do ponteiro. Este código lhe dará o resultado desejado:

 char buffer[10240]; printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

Se malloc() tiver sucesso, a memory apontada é pelo menos tão grande quanto você pediu, então não há razão para se preocupar com o tamanho real alocado.

Além disso, você alocou 10 kB, não 1 kB.

Cabe a você controlar o tamanho da memory, se necessário. A memory retornada pelo malloc é apenas um ponteiro para dados “não inicializados”. O operador sizeof está trabalhando apenas na variável buffer .

Não. O buffer é um char * . É um ponteiro para dados char . O ponteiro ocupa apenas 4 bytes (no seu sistema).

Ele aponta para 10240 bytes de dados (que, a propósito, não é 1Kb. Mais como 10Kb), mas o ponteiro não sabe disso . Considerar:

 int a1[3] = {0, 1, 2}; int a2[5] = {0, 1, 2, 3, 4}; int *p = a1; // sizeof a1 == 12 (3 * sizeof(int)) // but sizeof p == 4 p = a2 // sizeof a2 == 20 // sizeof p still == 4 

É a principal diferença entre arrays e pointers. Se não funcionasse dessa maneira, o sizeof p mudaria no código acima, o que não faz sentido para uma constante de tempo de compilation.

Substitua seu sizeof por malloc_usable_size (a página do manual indica que isso não é portátil, portanto, pode não estar disponível com sua implementação C específica).