Я думал, что не могу получить длину выделенного блока памяти, как простая функция .length
в Java. Однако теперь я знаю, что когда malloc()
выделяет блок, он выделяет дополнительные байты для хранения целого числа, содержащего размер блока. Это целое число расположено в начале блока; адрес, фактически возвращенный вызывающему, указывает на место, расположенное за этим значением длины. Проблема в том, что я не могу получить доступ к этому адресу, чтобы получить длину блока.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *str;
str = (char*) malloc(sizeof(char)*1000);
int *length;
length = str-4; /*because on 32 bit system, an int is 4 bytes long*/
printf("Length of str:%d\n", *length);
free(str);
}
** Edit: Наконец я это сделал. Проблема в том, что она продолжает давать 0, поскольку длина, а не размер в моей системе, связана с тем, что мой Ubuntu имеет 64 бит. Я изменил str-4 на str-8, и теперь он работает.
Если я изменю размер до 2000, он будет генерировать 2017 как длину. Однако, когда я перехожу на 3000, он дает 3009. Я использую GCC.