Найти длину массива malloc() в C?

Возможный дубликат:
Как найти sizeof (указатель, указывающий на массив)

Я изучаю, как создать динамический массив на C, но столкнулся с проблемой, которую я не могу понять.

Если я использую код:

int num[10];
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

Я получаю вывод:

sizeof num = 40
sizeof num[0] = 4

Это то, что я ожидаю. Однако, если я malloc размер массива, как:

int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

Затем я получаю вывод:

sizeof num = 8
sizeof num[0] = 4

Мне любопытно узнать, почему размер массива равен 40, когда я использую метод фиксированной длины, но не тогда, когда я использую malloc().

Ответ 1

Во втором случае num не является массивом, является указателем. sizeof дает вам размер указателя, который на вашей платформе кажется 8 байтами.

Нет способа узнать размер динамически распределенного массива, вам нужно сохранить его в другом месте. sizeof просматривает тип, но вы не можете получить полный массив (тип массива с указанным размером, например тип int[5]) из результата malloc, и аргумент sizeof может 't применяется к неполному типу, например int[].

Ответ 2

Массивы не являются указателями (распад указателей в некоторых ситуациях, а не здесь).

Первый - это массив - поэтому sizeof дает размер массива = 40 байт.

Второй указатель (независимо от того, сколько элементов он указывает) - sizeof дает вам sizeof(int*).

Ответ 3

Второй размер относится к размеру указателя, который на вашем компьютере - возможно, 64 бит - составляет 8 байтов.

Вы не можете использовать sizeof() для восстановления размера динамически распределенной структуры, но вы можете сделать это для статически выделенных.

Ответ 4

Если вы хотите узнать размер того, что вы выделили, вам нужно "запомнить" это самостоятельно, так как ваш код сделал выделение. Если ваш код не сделал выделение, тогда нет способа [в стандартном смысле] узнать, насколько большой указатель указывает на указатель. Вам просто нужно "знать" по-другому.