Размер массива в c ++ изменяется с помощью sizeof [duplicate]

0

У меня есть простой main, который называется простым методом с массивом в качестве параметра
размер в массиве прав, но тогда, когда я пытаюсь напечатать массив im, получающий разный массив sizeof:

int bubbleSort(int arr[]) // yeah i know this sort is not complete 
{
    int arrSize = sizeof(arr); // HERE IS SIZE IS 4 
    bool bSorted = true;
    while(bSorted)
    {
        for(int i=0;i<arrSize;i++)
        {

            if(arr[i]>arr[i+1])
            {
                int tmp =  arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = tmp;
            }


        }
        bSorted = false;
    }

    return 1;
}


int  main(int argc, char* argv[])
{


    int arr[] = {4,3,7,8,9};
    bubbleSort(arr);
    int sOf = sizeof(arr); // HERE THE SIZE IS 20 ????
    for(int j=0;j < sOf ;j++)
    {
        printf("%d",arr[j]);
    }
    return 0;
}
  • 0
    Используйте std::array . arr - указатель на функцию.
  • 0
    Никогда не используйте массивы в стиле C в программах на C ++, особенно в простых программах на C ++.
Теги:
arrays

2 ответа

4

Вы не можете передавать массивы * по значению в качестве параметров функции (и не возвращать их таким образом). Синтаксис void f(int a[]) - это просто синтаксический сахар, который во всех аспектах идентичен void f(int * a), а параметр функции - это указатель, а не массив. Таким образом, вы в конечном итоге измеряете размер указателя.

Альтернативный синтаксис может служить нечеткой документацией о намерениях, сигнализируя, что вы планируете вызывать эту функцию с адресом элемента массива, но фактической разницы в синтаксисе указателя нет.

*) Типы массивов и типы функций ограничены таким образом, поэтому люди часто говорят, что они не являются первоклассными гражданами системы типов.

  • 0
    как насчет этого макроса, который работает вне функции, но не внутри: #define ARRAY_SIZE (array) (sizeof ((array)) / sizeof ((array [0])))
  • 1
    @ user63898 Это не работает по той же причине.
0

Из-за того, что язык глуп, это:

int bubbleSort(int arr[])

на самом деле означает следующее:

int bubbleSort(int* arr)

Таким образом sizeof(arr) - это размер указателя.

Ещё вопросы

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