1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
1

Sizeof и Динамический символьный массив!

14.12.2016, 20:26. Показов 3995. Ответов 12
Метки нет (Все метки)

В первом примере sizeof показывает кол-во элементов в массиве!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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) / sizeof(CH[0]);
    
    system("pause");
}
А во втором примере с использованием динамического выделения показывает кол-во выделяемой памяти (типа)В данном случае(char).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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");
}
Как написать второй пример чтобы высчитывало размер символьного массива? Как и в первом примере.
Предполагаю что во втором примере я передаю не массив а элемент массива.
Если это так то как можно исправить это......не пойму.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2016, 20:26
Ответы с готовыми решениями:

Символьный динамический массив (printf/scanf)
Почему не работает? Проблема возникает, когда нужно вывести массив на экран. Возможно он...

Динамический символьный массив с не фиксированным размером
char* temp_str = new char; std::cin &gt;&gt; temp_str; std::cout &lt;&lt; temp_str; // выводит введенное...

Ввод данных/выделение памяти (динамический символьный массив)
1. Если ли разница в таких двух вариантах объявления динамического символьного массива: а) char...

Скопировать одномерный символьный массив в двумерный символьный массив
Здравствуйте, учусь программировать на Си. Столкнулся с проблемой: не могу скопировать одномерный...

12
16495 / 8988 / 2205
Регистрация: 30.01.2014
Сообщений: 15,603
14.12.2016, 20:39 2
Лучший ответ Сообщение было отмечено Maxim09 как решение

Решение

Цитата Сообщение от Maxim09 Посмотреть сообщение
Как написать второй пример чтобы высчитывало размер символьного массива?
В общем случае надо сохранять размерность массива где-то.
Что-то "высчитать" можно только в ограниченных случаях, например, если у нас С-строка и мы можем рассчитывать на нуль-символ в конце.

Добавлено через 5 минут
Maxim09, поправил твой пример:
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
#include <iostream>
#include <cstdlib>
#include <cstring>
 
using namespace std;
 
int main()
{
    const int n=6;
    int M[n] = { 8,3,7,4,5,11 };
    
    for(size_t i = 0; i < n; i++)
        cout << "M=" << M[i] << " ";
    cout << endl;
    
    
    char * ch = new char[n + 1];
    for(size_t i = 0; i < n; i++)
    {
        ch[i] = 'o' + M[i];
        cout << "Ch=" << ch[i] << " " << endl;
    }
    ch[n] = '\0'; // делаем С-строку
    
    cout << std::strlen(ch); // длина С-строки
    delete [] ch;
    system("pause");
}
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
14.12.2016, 20:40  [ТС] 3
Думаю думаю никак не придумаю как написать правильный код.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.12.2016, 20:40 4
Maxim09, читаем
Sizeof и Динамический символьный массив!
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
14.12.2016, 20:43  [ТС] 5
DrOffset, Спасибо большое.
0
Вездепух
Эксперт CЭксперт С++
10427 / 5697 / 1552
Регистрация: 18.10.2014
Сообщений: 14,059
14.12.2016, 20:48 6
Цитата Сообщение от Maxim09 Посмотреть сообщение
А во втором примере с использованием динамического выделения показывает кол-во выделяемой памяти (типа)В данном случае(char).
sizeof никогда не показывает никакое "кол-во выделяемой памяти". sizeof *ch во втором примере показывает размер типа операнда *ch, т.е. sizeof(char), т.е. 1 байт.

И в первом и во втором случае sizeof возвращает одно и то же - размер типа операнда.

Цитата Сообщение от Maxim09 Посмотреть сообщение
Как написать второй пример чтобы высчитывало размер символьного массива? Как и в первом примере.
Никак. Узнать размер динамически выделенного массива невозможно. Только вручную запоминать этот размер.
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
14.12.2016, 21:00  [ТС] 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никак. Узнать размер динамически выделенног массива невозможно.
А почему не возможно? Если в массив ведь передаётся кол-во символов для ввода вот:
C++
1
new char[n + 1]
И где про этот 'момент' можно причитать?
0
Вездепух
Эксперт CЭксперт С++
10427 / 5697 / 1552
Регистрация: 18.10.2014
Сообщений: 14,059
14.12.2016, 21:05 8
Цитата Сообщение от Maxim09 Посмотреть сообщение
А почему не возможно? Если в массив ведь передаётся кол-во символов для ввода вот:
Оно-то передается. И даже может быть где-то там внутри запоминается (см. Можно ли обойти динамический массив не зная его размер?)

Но язык С++ не предоставляет средств для того, чтобы потом этот размер оттуда как-то "выцарапать". Поэтому запоминать его приходится самостоятельно и вручную.
0
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
14.12.2016, 21:09  [ТС] 9
А если допустим нужно вычислить размер символьного массива? То как это можно осуществить?
0
Эксперт С++
8719 / 4299 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
14.12.2016, 21:14 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Узнать размер динамически выделенного массива невозможно.
возможно при помощи расширений от компиляторов.
https://msdn.microsoft.com/ru-... 077bc.aspx
0
16495 / 8988 / 2205
Регистрация: 30.01.2014
Сообщений: 15,603
14.12.2016, 21:22 11
Цитата Сообщение от Maxim09 Посмотреть сообщение
А если допустим нужно вычислить размер символьного массива? То как это можно осуществить?
Если под символьным массивом понимается С-строка (обычно таки именно это и понимается), то пример вычисления размера такой строки дан был выше.
1
Вездепух
Эксперт CЭксперт С++
10427 / 5697 / 1552
Регистрация: 18.10.2014
Сообщений: 14,059
14.12.2016, 23:27 12
Цитата Сообщение от hoggy Посмотреть сообщение
возможно при помощи расширений от компиляторов.
https://msdn.microsoft.com/ru-... 077bc.aspx
Разумеется. Но, во-первых, это частные расширения. И, во-вторых, _msize - это функция группы malloc/free, то есть она возвращает размер выделенного сырого блока памяти. Он в общем случае может быть больше запрошенного new[] размера массива.

Размер же массива, передававшийся в new[] в случае char массива не хранится нигде вообще (как я уже подробно писал по приводившейся ссылке). Поэтому запросить его не получится даже через расширения.

И, кстати, если вспомнить, что для типов с нетривиальным деструктором new[] запоминает рамер массива отдельно, то становится ясно, что в общем случае передавать возвращенный new[] указатель в _msize нельзя. Осмысленного результата оно не вернет, даже если не накроется.

Добавлено через 1 час 34 минуты
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
#include <iostream>
 
struct Trivial
{
  int i = 42;
};
 
struct NonTrivial
{
  int i = 42;
  ~NonTrivial() { std::cout << "Hello" << std::endl; }
};
 
 
int main() 
{
  Trivial *t = new Trivial[100];
  std::cout << _msize(t) << std::endl;
  delete[] t;
 
  NonTrivial *nt = new NonTrivial[100];
  std::cout << _msize(nt) << std::endl;
  delete[] nt;
}
Успешно накрывается медным тазом во втором случае применения _msize.
3
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 9
13.10.2018, 21:19 13
sizeof() здесь не поможет. Дабы узнать длину символьного массива можно написать функцию:
C++
1
2
3
4
5
6
7
size_t sizeofstring(char *c)
{size_t i = 0;
    for (; c[i] != '\0'; i++)
    {
    }
    return i;
}
ну как - то так.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2018, 21:19
Помогаю со студенческими работами здесь

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив,...

Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?
Является ли оператор sizeof синтаксическим сахаром над...

Сделать динамический массив структур, причем в структуре так же существует динамический массив
Добрый день. Есть такая пзадача: нужно сделать динамический массив структур, причем в структуре...

Sizeof(.) или constexpr size_t tmp = sizeof(.)
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности?...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru