Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2016, 14:37   #1
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию sizeof и динамическое выделение памяти!

В первом примере sizeof показывает кол-во элементов в массиве!

Код:
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
    const int n=5;
    int M[n]={8,3,3,4,5};
    for(int i=0; i<n; i++)
    cout<<"M="<<M[i]<<" ";
 
    cout<<endl;
 
    const char ch=n;
    char CH[ch];
    for(char i=0; i<ch; i++)
    {
    CH[i] = M[i] + 'o';
    cout<<"Ch="<<CH[i]<<" "<<endl;
    }
    cout<<sizeof(CH);
    
    system("pause");
}

А во втором примере с использованием динамического выделения показывает кол-во выделяемой памяти (типа)В данном случае(char). Почему так?

Код:
#include<iostream>
#include <cstdlib>
#include<cmath>
using namespace std;
void main()
{
    const int n=6;
    int M[n]={8,3,7,4,5,11};
    for(int i=0; i<n; i++)
    cout<<"M="<<M[i]<<" ";
 
    cout<<endl;
 
    char *ch = new char[n];
    for(char i=0; i<n; i++)
    {
    ch[i] = 'o' + M[i];
    cout<<"Ch="<<ch[i]<<" "<<endl;
    }
    cout<<sizeof *ch;
    delete []ch;
    system("pause");
}
Поясните почему так происходит и если не сложно исправьте ошибку!

Вместо раскраски текста лучше бы код научился правильно оформлять. См. кнопку #
Модератор

Последний раз редактировалось Аватар; 14.12.2016 в 14:41.
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 14:44   #2
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

Сори по поводу кода, думал это только для (СИ-шарпа)
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 15:06   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что в первом случае вы даете ему на вход массив, а во втором элемент массива - char.
p51x вне форума Ответить с цитированием
Старый 14.12.2016, 15:09   #4
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

А как дать и во втором тоже массив?
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 15:46   #5
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от max29 Посмотреть сообщение
В первом примере sizeof показывает кол-во элементов в массиве!
Никакого
Код:
к-ва элементов
массива sizeof() не показывает - это заблуждение!
sizeof() в этом случае показывает размер занимаемый массивом.
А вам это показалось к-вом элементов только потому, что размер одного элемента этого массива совпал с 1 байтом.

Если вас действительно интересовал бы размер массива, то для этог нужно воспользоваться выражением:
Код:
sizeof( array ) / sizeof( array[ 0 ] )
А во 2-м случае вы получаете только размер типа данных, на который указывает указатель.
И нет никакого способа определить размерность на сколько там таких элементов указывает указатель.

Последний раз редактировалось olej.tsil; 14.12.2016 в 15:48.
olej.tsil вне форума Ответить с цитированием
Старый 14.12.2016, 15:53   #6
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

Спс, и жаль что нет никакого способа это узнать((
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 15:59   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от max29 Посмотреть сообщение
Спс, и жаль что нет никакого способа это узнать((
Есть такой способ!
У вас C++ - используйте vector<char>, string и т.д.
olej.tsil вне форума Ответить с цитированием
Старый 14.12.2016, 16:03   #8
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

попробую.
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 16:11   #9
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

Если я буду использовать vector стоит ли вообще использовать в таком случае 2 цикла и 2 массива? может сразу можно дать vector-ом и посчитать сколько там элементов?
max29 вне форума Ответить с цитированием
Старый 14.12.2016, 16:24   #10
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от max29 Посмотреть сообщение
Если я буду использовать vector стоит ли вообще использовать в таком случае 2 цикла и 2 массива?
Это вы сами решайте что и как использовать для поставленной задачи, адекватные способы.

Но, для любых задач, хорошо уясните разницу между: char* и char[] (это совершенно разные вещи), vector<char> и string (это похожие, но разные вещи).
olej.tsil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое выделение памяти! Bantom Помощь студентам 1 07.04.2014 12:48
Динамическое выделение памяти Bantom Помощь студентам 0 02.04.2014 22:35
Динамическое выделение памяти Devdev12 Общие вопросы C/C++ 13 02.08.2013 10:25
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Динамическое выделение памяти FW-TOT Общие вопросы C/C++ 2 19.12.2008 00:42