С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 335
1

Объяснить почему sizeof(arr) всегда возвращает одно и то же значение

26.12.2015, 17:02. Просмотров 918. Ответов 5
Метки нет (Все метки)

Начал изучать динамические массивы. Какое бы n я ни вводил, всегда создается массив из 4 элементов.
Что я упустил?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
const int MAX_SIZE = 100;
 
void vErrMsg()
{
    cout << "Ошибка: Значение должно быть больше нуля и меньше или равно " << MAX_SIZE << endl;
    cout << "Пожалуйста, повторите попытку." << endl;
}
 
void iErrMsg()
{
    cout << "Ошибка: Веденное значение не относится к типу int (–2147483648...+2147483647)." << endl;
    cout << "Пожалуйста, повторите попытку." << endl;
}
 
int getArrSize(int n, char *msg1)
{
    bool bValid = false;
    while (!bValid){
        if (cin.fail()){
            iErrMsg();
            cout << msg1 << MAX_SIZE << endl;
            cin.clear();
            cin >> n;
        }else{
            if ( (n > 0) && (n <= MAX_SIZE) )
            {
                bValid = true;
            }else{
                vErrMsg();
                cout << msg1 << MAX_SIZE << endl;
                cin.clear();
                cin >> n;
            }
        }
    }
    return n;
}
 
int* createSingleArr(int sz)
{
    int* arr = new int[sz];
    cout << "create_sizeof = " << sizeof(arr) << endl;
    return &arr[0];
}
 
void fillSingleArr(int* arr)
{
    for (int i = 0; i < sizeof(arr); i++){
        arr[i] = rand()%100-50;;
    }
}
 
void showSingleArr(int* arr)
{
    for (int i = 0; i < sizeof(arr); i++){
        cout << arr[i] << " ";
    }
    return;
}
 
void delSingleArr(int* arr)
{
    delete[] arr;
    return;
}
 
int main()
{
    /* Шапка */
    setlocale(LC_ALL,"Russian");
 
    //
    char inputMsg1[] = "Введите размер массива. Длина не должна превышать ";
    cout << inputMsg1 << MAX_SIZE << endl;
    int n;
    cin >> n;
    n = getArrSize(n, &inputMsg1[0]);
    //Корректно
    int* p;
    p = createSingleArr(n);
    cout << "sizeof = " << sizeof(&p[0]) << endl;
    fillSingleArr(&p[0]);
    showSingleArr(&p[0]);
    delSingleArr(&p[0]);
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2015, 17:02
Ответы с готовыми решениями:

Почему *arr И arr[] одинаковые, но в тоже время разные?
Например есть какая-то ф-я:void temp(int &amp;(*arr)) { // . . . } И 2...

Почему функция всегда возвращает 0?
bool trie_tree::consonants_check(char letter) { return tolower(letter) ==...

Орел-решка, всегда одно и тоже значение
При компиляции каждый раз получаю ответ &quot;Решка&quot; #include &lt;iostream&gt; #include...

Программа всегда выводит одно и тоже значение при разных вводимых данных
Не думаю, что дело в коде, но значение всегда выводилось n = 2 и pos = 2. ...

Как убрать привилегии системы? Почему GetUserName всегда возвращает "SYSTEM"?
Здорово, народ! У меня такая ситуация - есть программа, работающая как служба,...

5
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 335
26.12.2015, 17:03  [ТС] 2
Объяснить почему sizeof(arr) всегда возвращает одно и то же значение
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
26.12.2015, 17:06 3
Цитата Сообщение от Bolbine84455 Посмотреть сообщение
Начал изучать динамические массивы. Какое бы n я ни вводил, всегда создается массив из 4 элементов.
Что я упустил?
Ты написал запутанный и кривой код, так что это уже не проследить, оператор работает правильно, а твой код нет.

Цитата Сообщение от Bolbine84455 Посмотреть сообщение
cout << "sizeof = " << sizeof(&p[0]) << endl;
тут вы вывел размер только первого элемента интового массива
1
zss
Модератор
Эксперт С++
7494 / 6857 / 4330
Регистрация: 18.12.2011
Сообщений: 18,147
Завершенные тесты: 1
26.12.2015, 17:20 4
Лучший ответ Сообщение было отмечено Bolbine84455 как решение

Решение

Цитата Сообщение от Bolbine84455 Посмотреть сообщение
C++
1
2
int* arr = new int[sz]; 
cout << "create_sizeof = " << sizeof(arr) << endl;
arr - указатель на int, а не массив.
Поэтому sizeof(arr) - размер указателя ( 4 байта)
C++
1
2
int arr[10]; 
cout << "create_sizeof = " << sizeof(arr) << endl;
Здесь arr - массив из 10 элементов.
Поэтому sizeof(arr) даст 40 байт
1
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 335
26.12.2015, 17:23  [ТС] 5
Выводит 4 при любом sz
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main()
{
    /* Шапка */
    setlocale(LC_ALL,"Russian");
    int sz = 3;
    int* arr = new int[sz];
    cout << "create_sizeof = " << sizeof(arr) << endl;
    return 0;
}
Добавлено через 1 минуту
т.е. размер массива мне никак не узнать и придется длину передавать всегда?
0
zss
Модератор
Эксперт С++
7494 / 6857 / 4330
Регистрация: 18.12.2011
Сообщений: 18,147
Завершенные тесты: 1
26.12.2015, 17:23 6
Лучший ответ Сообщение было отмечено Bolbine84455 как решение

Решение

Bolbine84455, Еще раз повторяю, это размер памяти, который необходим для хранения одного указателя на int.

Размер выделенной динамической памяти определить невозможно!
1
26.12.2015, 17:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2015, 17:23

Почему работает и так, и так: arr[i] и i[arr]?
//один и тот же результат cout&lt;&lt;arr; cout&lt;&lt;i;//почему нет ошибки да даже...

Программа всегда выдаёт всегда одно и то же
Суть программы в том, что из вводимого массива программа выбирает нечётные...

Функция sizeof() всегда должна присваиваться какой либо переменной?
Если на 32 строке убрать int i т.е. написать просто sizeof(s); то программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru