@evg_96

Почему sizeof показывает фактический размер массива хотя по сути имя массива это указатель на первый элемент?

Почему sizeof marbles равняется 40 байтам, хотя marbles это указтель на первый элемент массива? (printf("%d", marbles == &marbles[0]); // true)
Вот в функции sum все логично, в функцию передается указатель на первый элемент, и собственно выводится размер указателя равный 8 байтам.

почему marbles == &marbles[0], но sizeof(marbles) != sizeof &marbles[0]?

#include <stdio.h>
#include <conio.h>

#define SIZE 10

int sum(int * arr, int n);

int main(void)
{
    int marbles[SIZE] = { 20, 10, 5, 39, 4, 16, 19, 26, 31, 20 };
    long answer = sum(marbles, SIZE);

    printf("Common sum of array items = %ld.\n", answer);
    printf("Memory: %zd bytes.\n", sizeof marbles); // 40
    printf("%d", marbles == &marbles[0]); // true

    _getch();

    return 0;
}

int sum(int * arr, int n)
{
    int index;
    int total = 0;
    
    for (index = 0; index < n; index++)
        total += *(arr + index);

    printf("Size of arr = %zd bytes.\n", sizeof arr); // 8

    return total;
}
  • Вопрос задан
  • 914 просмотров
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
По сути статический массив это действительно указатель. Но реально тип другой и компилятор знает реальный размер массива. После того как вы приводите массив к типу указателя (например при передаче в функцию), эта информация теряется и sizeof уже вернет размер указателя.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Несмотря на то, что массив часто отождествляют с указателем, массив — это НЕ указатель. У него, например, другие операции приводят к неопределённому поведению.

И самое противное в Си — это то, что в коде
void sort(int x[5]);
x — это не массив, а именно что указатель. Чтобы был массив, надо Си++
void sort(int (&x)[5]);
И компилятор даже подсвечивает, что параметр функции, отмеченный как массив — всегда указатель.
typedef int Arr[SIZE];
int sum(Arr arr, int n)
// warning: 'sizeof' on array function parameter 'arr' will return size of 'int *' [-Wsizeof-array-argument]|
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы