Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Сколько памяти занимает квадратная матрица вида char c[3][3]?

27.12.2016, 08:29. Показов 3252. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, недавно задали вопрос: "Сколько памяти занимает матрица вида"
C++
1
char c[3][3];
Я сразу ответил 9 байт. На что последовал отрицательный ответ. Сказали что 21. Якобы
C++
1
*char(x 3)
= 12 байт, и еще плюс 9 = 21 байт. В VS через sizeof(arr) получилось 9. Так какой же правильный ответ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2016, 08:29
Ответы с готовыми решениями:

Сколько памяти занимает цикл while?
Сколько памяти занимает цикл while?

Сколько памяти занимает метод?
Сколько памяти в классе выделяется под метод?

Сколько памяти занимает указатель
А сколько памяти занимает указатель?И от чего это зависит?

6
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.12.2016, 08:33
Цитата Сообщение от Jman Посмотреть сообщение
Так какой же правильный ответ?
...
Цитата Сообщение от Jman Посмотреть сообщение
Я сразу ответил 9 байт.
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
27.12.2016, 08:37  [ТС]
Странно, и это мне сказал гуру, гик и ментор =) А вот в случае если
C++
1
2
3
  char** ptC = new char* [3]; 
    for (int count = 0; count < 3; count++)
        ptC[count] = new char[3];
Нет под рукой компилятора. Думаю тут как раз и будет 21 наверное.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.12.2016, 08:50
Цитата Сообщение от Jman Посмотреть сообщение
Думаю тут как раз и будет 21 наверное.
В сумме (через new), но тут цельного массива нет (как в первом случае).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
27.12.2016, 08:58
Цитата Сообщение от Jman Посмотреть сообщение
Я сразу ответил 9 байт.
Совершенно правильный ответ - 9 байт.

Цитата Сообщение от Jman Посмотреть сообщение
На что последовал отрицательный ответ. Сказали что 21.
Сказали ерунду. Откуда могло взяться 21 - понятно. Такое мог мог сказать только "пионэр", уперто верящий, что массив - это указатель.

Цитата Сообщение от Jman Посмотреть сообщение
Думаю тут как раз и будет 21 наверное.
Соврешенно верно. Но к char c[3][3] это не имеет никакого отношения вообще.
1
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
27.12.2016, 09:57
Jman,

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
#pragma hdrstop
 
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR *argv[]) {
 
  char c[3][3];
  int sc, sd1, sd2;
  sc = sizeof(c);
  sd1 = 3*sizeof(c[1]);
  sd2 = 9*sizeof(c[1][1]);
  std::cout << "sizeof(c) = " << sc << std::endl;
  std::cout<<"3*sizeof(c[1]) = "<<sd1<<std::endl;
  std::cout<<"9*sizeof(c[1][1]) = "<<sd2<<std::endl;
 
 
  char ** cnew = new char*[3];
    for (int i = 0; i < 3; i++) {
      cnew[i] = new char[3];
      memset(cnew[i], 0, 3* sizeof(char));
    }
 
  sc = sizeof(cnew);
  sd1 = 3*sizeof(cnew[1]);
  sd2 = 9*sizeof(cnew[1][1]);
  std::cout << "sizeof(cnew) = " << sc << std::endl;
  std::cout<<"3*sizeof(cnew[1]) = "<<sd1<<std::endl;
  std::cout<<"9*sizeof(cnew[1][1]) = "<<sd2<<std::endl;
  std::cout << "all memory used by the array cnew[][] = " << (sc+sd1+sd2) << std::endl;
 
  system("pause");
  return 0;
}
//---------------------------------------------------------------------------
и вывод программы
sizeof(c) = 9
3*sizeof(c[1]) = 9
9*sizeof(c[1][1]) = 9
sizeof(cnew) = 4
3*sizeof(cnew[1]) = 12
9*sizeof(cnew[1][1]) = 9
all memory used by the array cnew[][] = 25
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.12.2016, 13:56
Лучший ответ Сообщение было отмечено Jman как решение

Решение

Цитата Сообщение от Jman Посмотреть сообщение
Сколько памяти занимает матрица вида char c[3][3];
9 байт or GTFO

Добавлено через 25 минут
С такими вопросами надо подкреплять аргументы ссылками.
8.3.4 Arrays
1. In a declaration T D where D has the form
D1 [ constant-expressionopt] attribute-specifier-seqopt
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type
of the identifier of D is an array type; if the type of the identifier of D contains the auto type-specifier,
the program is ill-formed. T is called the array element type; this type shall not be a reference type, the
(possibly cv-qualified) type void, a function type or an abstract class type. If the constant-expression (5.19)
is present, it shall be a converted constant expression of type std::size_t and its value shall be greater
than zero. The constant expression specifies the bound of (number of elements in) the array. If the value of
the constant expression is N, the array has N elements numbered 0 to N-1, and the type of the identifier of D is
“derived-declarator-type-list array of N T”. An object of array type contains a contiguously allocated non-empty
set of N subobjects of type T
. Except as noted below, if the constant expression is omitted, the type of the
identifier of D is “derived-declarator-type-list array of unknown bound of T”, an incomplete object type. The
type “derived-declarator-type-list array of N T” is a different type from the type “derived-declarator-type-list array
of unknown bound of T”, see 3.9. Any type of the form “cv-qualifier-seq array of N T” is adjusted to “array
of N cv-qualifier-seq T”, and similarly for “array of unknown bound of T”. The optional attribute-specifier-seq
appertains to the array. [ Example:
typedef int A[5], AA[2][3];
typedef const A CA; // type is “array of 5 const int”
typedef const AA CAA; // type is “array of 2 array of 3 const int
2. An array can be constructed from one of the fundamental types (except void), from a pointer, from a pointer
to member, from a class, from an enumeration type, or from another array.
То есть char c[3][3] это массив из трёх элементов типа char [3], которые в свою очередь являются массивами.
Имеем три последовательно расположенных массива, в которых последовательно расположено по 3 элемента.
Учитывая, что размер char определён стандартом
5.3.3 Sizeof
1. <...> sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1 <...>
Получаем 3*3 равно 9 последовательно расположенных элемента, каждый размером в 1 байт. Итого 9 байт.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2016, 13:56
Помогаю со студенческими работами здесь

Сколько переменная занимает в памяти
scanf_s DB &quot;%d&quot;, 0 это же строка с переходом на новую? и занимает в памяти 3 байта? скажите, пожалуйста, а то немного...

QuickSort: сколько дополнительной памяти он занимает
Всем доброго времени суток! Мне не даёт покоя QuickSort, всё хочется узнать сколько же он дополнительной памяти занимает? Много разных...

Сколько памяти занимает объединение union
Помогите пожалуйста разобраться. Сколько памяти занимает объединение union Z { int a; float b; char c; }; ? И как вообще это делать?...

Узнать сколько занимает памяти объект.
Здравствуйте. Кто нибудь в курсе, как можно узнать сколько &quot;весит&quot; экземпляр написанного мной класса? То есть мне нужно создать экземпляр...

Сколько памяти занимает указатель? Ссылка?
Вот никак не могу найти ответы на эти вопросы. Указатели и ссылки эффективны в плане времени, но что касается выделяемой памяти, хотелось...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru