Я запускаю следующий код, но он сохранил печать "4",
почему его печать "4", а не "12"? и могу ли я использовать malloc, а затем sizeof? (если я смогу, то как)
#include<stdio.h>
int main()
{
int arr1[3]={1,2,3};
int *arr2=arr1,i;
printf("%d",sizeof(arr2));
return 0;
}
Указатели не являются массивами. arr2
- указатель на int
. sizeof(arr2)
вернет размер указателя. Чтобы напечатать размер массива, операнд sizeof
должен иметь тип массива:
printf("%u",sizeof(arr1));
могу ли я использовать
malloc
а затемsizeof
?
Нет. Нет портативного способа узнать размер блока malloc'ed. malloc
возвращает указатель на выделенную память. sizeof
этот указатель вернет размер самого указателя. Но вы должны заметить, что при распределении памяти динамически нет необходимости использовать sizeof
. В этом случае вы уже знаете размер массива. (В случае использования массива char
используйте strlen
).
Дальнейшее чтение: c-faq: Почему sizeof
не говорит мне размер блока памяти, на который указывает указатель?
sizeof(arr2)
будет печатать размер указателя как его int*
. Однако, если вы попробуете sizeof(arr1)
, он будет печатать
sizeof(element_type) * array_size
т.е. размер массива. Помните, что он не учитывает количество элементов в массиве. Он просто рассмотрит, сколько элементов может хранить массив.
arr2
- указатель, и вы печатаете sizeof(pointer)
sizeof(arr1)
даст вам массив sizeof, который может дать вам 12. (Учитывая, что ваше целое число равно 4 байтам)
Он печатает 4, потому что arr2
- это указатель, а размер указателя - 4 байта в 32-битных архитектурах. Вы не можете знать размер динамически распределенного массива (массив, выделенный с помощью malloc), с указанием только указателя на него.