Форум программистов, компьютерный форум CyberForum.ru

Размер массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 161, средняя оценка - 4.93
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
03.09.2011, 16:49     Размер массива #1
Нужно создать массив для хранения различных символов (буквы и различные знаки)
Необходимо узнать его размер. Как это сделать? В массиве хранятся

C++
1
2
// символы поодиночке
char *a = new char [35];
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
03.09.2011, 16:55     Размер массива #2
Самое простое запомнить, сколько выделяли памяти.
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 17:46     Размер массива #3
Цитата Сообщение от hello19 Посмотреть сообщение
Нужно создать массив для хранения различных символов (буквы и различные знаки)
Необходимо узнать его размер. Как это сделать? В массиве хранятся
- для строки прото:
длинна массива = strlen(a); //для подключения нужен string.h
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.09.2011, 02:25     Размер массива #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
длинна массива = strlen(a);
Ноу, это длина строки. Это не одно и тоже.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
04.09.2011, 03:33     Размер массива #5
Цитата Сообщение от kazak Посмотреть сообщение
Ноу, это длина строки. Это не одно и тоже.
насколько я понял -=ЮрА=-, то имеется ввиду что char = 1 байт => strlen(a) = искомая память в байтах
-=ЮрА=-
Заблокирован
Автор FAQ
04.09.2011, 12:08     Размер массива #6
Цитата Сообщение от kazak Посмотреть сообщение
Ноу, это длина строки.
поэтому и оговорил
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- для строки прото:
(писал под пример ТС
Цитата Сообщение от hello19 Посмотреть сообщение
// символы поодиночке
char *a = new char [35];
)


Цитата Сообщение от alkagolik Посмотреть сообщение
насколько я понял -=ЮрА=-, то имеется ввиду что char = 1 байт => strlen(a)
- нет ты путаешь sizeof(a) со strlen(a) (см здесь http://www.cplusplus.com/reference/c...string/strlen/)
Если же есть желание использовать sizeof(a), то число элементов одномерного массива определяется выражением
i
C++
1
nt nElements =  sizeof(a)/sizeof(a[0])
или же
C++
1
sizeof(a)/sizeof((типа переменных массива а))
- указанный приём не работает для динамически созданных массивов - т.е для задания ТС применим только метод со strlen.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
04.09.2011, 16:35     Размер массива #7
оно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int sizeMass(char mass[]);
int main()
{
    char/*1 байт*/ *a = new char[35];
    a= "123456";
    std::cout << "длина массива в байтах = " << sizeMass(&a[0]) << "\n" << a;
    return 0;
}
int sizeMass(char mass[]){
    int i=0;
    while (mass[i]!= NULL) ++i;
    return i;
}
-=ЮрА=-
Заблокирован
Автор FAQ
04.09.2011, 16:44     Размер массива #8
Цитата Сообщение от alkagolik Посмотреть сообщение
int sizeMass(char mass[]){
* * int i=0;
* * while (mass[i]!= NULL) ++i;
* * return i;
}
- эквивалентно strlen(mass), зачем код удлинять?

Добавлено через 2 минуты
PS:Не веришь, убедись сам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstring>
 
int sizeMass(char mass[]);
int main()
{
    char/*1 ГЎГ*éò*/ *a = new char[35];
    a= "123456";
    std::cout << "äëèГ*Г* Г¬Г*Г±Г±ГЁГўГ* Гў ГЎГ*éòГ*Гµ = " <<sizeMass(&a[0])<<"\r\n";
    std::cout << "äëèГ*Г* Г¬Г*Г±Г±ГІГўГ* ГЇГ® strlen = "<<strlen(a)<<"\r\n";
    return 0;
}
int sizeMass(char mass[]){
    int i=0;
    while (mass[i]!= NULL) ++i;
    return i;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
04.09.2011, 17:31     Размер массива #9
Цитата Сообщение от hello19 Посмотреть сообщение
Необходимо узнать его размер. Как это сделать? В массиве хранятся
C++
1
2
// символы поодиночке
char *a = new char [35];
Во-первых размер массива тебе и так всегда известен(потому как ты этот размер и устанавливаешь). Во-вторых абсолютно непонятно зачем ты используешь динамический массив как статический(задаешь размер константой).

Цитата Сообщение от alkagolik Посмотреть сообщение
C++
1
2
char/*1 байт*/ *a = new char[35];
 a= "123456";
Ты присвоил указателю a адрес строкового литерала "123456". В результате сразу две ошибки:
1) неконстантный указатель на константную область памяти;
2) всё что было выделено с помощью оператора new безвозвратно потеряно(утечка памяти).
Цитата Сообщение от alkagolik Посмотреть сообщение
C++
1
while (mass[i]!= NULL)
Принципиально неверное использование макроса NULL. В конце C-строк находится символ '\0'. Макрос NULL ипользуется при работе с указателями.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.09.2011, 17:37     Размер массива #10
hello19, размер динамического массива узнать никак нельзя, так что нужно его запоминать.
Варианты выше с использованием strlen (и его "самописной реализацией") - вообще ни к месту и "длину массива в байтах" не возвращают.
Сыроежка
Заблокирован
04.09.2011, 18:21     Размер массива #11
Цитата Сообщение от rangerx Посмотреть сообщение
Ты присвоил указателю a адрес строкового литерала "123456". В результате сразу две ошибки:
1) неконстантный указатель на константную область памяти;
...
Это не является ошибкой. Стандарт С++ разрешает адрес строкового литерала присваивать неконстантному указателю. Другое дело, что лучше не пользоваться этим, чтобы не вводить пользователей вашего кода в заблуждение.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
04.09.2011, 22:51     Размер массива #12
1) неконстантный указатель на константную область памяти;
2) всё что было выделено с помощью оператора new безвозвратно потеряно(утечка памяти).
да ладно. первое всего лишь для демонстрации, а второе сам ТС задал. К делу... выделен массив char*, тип char = 1 байт, размер массива в байтах разве не равен количеству элементов, исключающих '\0'~NULL? т.е. массив заполнен на 5 элементов, значит размер массива есть 5 байт.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
04.09.2011, 23:54     Размер массива #13
Цитата Сообщение от alkagolik Посмотреть сообщение
да ладно. первое всего лишь для демонстрации
Для демонстрации чего? Как делать не надо? ))
Цитата Сообщение от alkagolik Посмотреть сообщение
а второе сам ТС задал.
TC всего лишь выделил память. А ты, вместо того чтобы воспользоваться функцией strcpy, решил её(память) просто "отстегнуть" происвоив указателю совершенно другой адрес... Насчёт самой функции: она вычисляет длину C-строки, но TC ни слова не говорил о строках...
P.S. Проще использовать std::vector<char> и не мучиться )
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.09.2011, 00:47     Размер массива #14
rangerx, троллить будешь школоту. Я не синтаксис представил, а мысль, которая заключается в том что размер массива char равен количеству элементов массива (? уже в четвертый раз спрашиваю). Синтаксис лепи себе как угодно. Оправдываться еще буду тут... ща в нос дам! шутка конечно. Но ведь ты тоже "юморной" йопт, поймешь.
фотку видишь мою? я такой))
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.09.2011, 02:52     Размер массива #15
Цитата Сообщение от alkagolik Посмотреть сообщение
Я не синтаксис представил, а мысль, которая заключается в том что размер массива char равен количеству элементов массива
это та мысль, которую ты озвучил в посте #7 (или #5)? Так вот, она неверная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2011, 03:16     Размер массива
Еще ссылки по теме:

C++ Размер двумерного массива
Размер массива C++
Функция с применением динамического массива, чтобы размер массива увеличивался по мере необходимости C++

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.09.2011, 03:16     Размер массива #16
Цитата Сообщение от Nameless One Посмотреть сообщение
это та мысль, которую ты озвучил в посте #7 (или #5)? Так вот, она неверная
ну наконец-то дождался ответа
Yandex
Объявления
05.09.2011, 03:16     Размер массива
Ответ Создать тему
Опции темы

Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru