как я могу узнать количество элементов в массиве [дубликата]

0

Я запускаю следующий код, но он сохранил печать "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;
} 
Теги:
arrays
dynamic
memory-management

4 ответа

8

Указатели не являются массивами. arr2 - указатель на int. sizeof(arr2) вернет размер указателя. Чтобы напечатать размер массива, операнд sizeof должен иметь тип массива:

printf("%u",sizeof(arr1));  

могу ли я использовать malloc а затем sizeof?

Нет. Нет портативного способа узнать размер блока malloc'ed. malloc возвращает указатель на выделенную память. sizeof этот указатель вернет размер самого указателя. Но вы должны заметить, что при распределении памяти динамически нет необходимости использовать sizeof. В этом случае вы уже знаете размер массива. (В случае использования массива char используйте strlen).

Дальнейшее чтение: c-faq: Почему sizeof не говорит мне размер блока памяти, на который указывает указатель?

6
sizeof(arr2)

будет печатать размер указателя как его int*. Однако, если вы попробуете sizeof(arr1), он будет печатать

sizeof(element_type) * array_size

т.е. размер массива. Помните, что он не учитывает количество элементов в массиве. Он просто рассмотрит, сколько элементов может хранить массив.

6

arr2 - указатель, и вы печатаете sizeof(pointer)

sizeof(arr1) даст вам массив sizeof, который может дать вам 12. (Учитывая, что ваше целое число равно 4 байтам)

3

Он печатает 4, потому что arr2 - это указатель, а размер указателя - 4 байта в 32-битных архитектурах. Вы не можете знать размер динамически распределенного массива (массив, выделенный с помощью malloc), с указанием только указателя на него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню