Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Размер указателя 
V
    Опции темы
PRF
Дата 6.12.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



[C++]
Привет!! У меня такой вопрос, а точнее его задал учитель по программированию.
Код
char * b = new char[10];
sizeof(b);
strlen(b);

Вот такой вопрос:
Какой размер будет выведен (размер b) используя эти функции 1) sizeof(b) 2) strlen(b)???
Если в 1 случае sizeof(b) = 4 байт!!! 
Во втором я не знаю??? Могу сказать одно, что по логике должно быть = 0, т.к строка не задана, а только выделена память под нее, но когда я написал этот код, то strlen(b) стал  = 14!!???
Помогите!!!
Заранее спасибо!!!

PM MAIL   Вверх
zkv
Дата 6.12.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



если говорить строго, то в этом примере:
Код

char * b = new char[10];
sizeof(b);
strlen(b);

нельзя сказать определенно, ни про первое ни про второе значение.
sizeof(char *); - размер указателя зависит от платформы, чаще всего он равен 4 байтам, если интересно узнать про другие варианты, то поиск поможет.

strlen(b); - тут вообще полная неопределенность, так как массив не инициализирован, функция strlen() считает элементы в массиве, до первого встретившегося нуль-символа. В данном он может встретиться только случайно, возможно в участке памяти даже за пределами массива, отсюда результат 14, в других условиях (на другой машине, в другой момент времени запуска, да просто звезды так сложатся) результат может быть другим.
Если бы мы инициализировали массив (естественно правильно) то функция давала бы количество элементов до первого нуля, например такой код даст 0:
Код

char * b = new char[10] = {0};
strlen(b);


Цитата(PRF @  6.12.2007,  18:00 Найти цитируемый пост)
используя эти функции 1) sizeof(b) 

передай преподу, что sizeof это не функция а оператор  smile Посоветуй почитать Страуструпа.

Это сообщение отредактировал(а) zkv - 6.12.2007, 18:37
PM MAIL   Вверх
PRF
Дата 6.12.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Цитата

передай преподу, что sizeof это не функция а оператор

ну это не препод сказал функция, а я!!!
Спасибо!!!

И еще если про строковые указатели, то можете помочь разобраться в этой задачи!!! я не прошу решить ее и написать код, а просто объяснить, я не могу понять что и как!!!

Задача!!!

Создать массив строк. У пользователя должна быть возможность добавлять строку и просматривать на экране весь массив строк. Строки могут иметь разную длину, то есть память под них должна выделяться динамически. Использовать массив указателей на массивы строк!!

В этой задачи я на понимаю "Использовать массив указателей на массивы строк!!"
Вроде все остальное понятно, только вот то что указатель на чар может выделить память максимум в 255 символов 
Код

char* ukaz = new char[255];

Если строка будет больше 255 символов, то мы должны выделить новую память большего размера, скопировать туда эту строку и удалить предыдущую!! Я это где то прочитал!! Но вот в чем дело, как выделить память большего размера > 255 символов, если максимум 255 символов, не понимаю???

PM MAIL   Вверх
zkv
Дата 6.12.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



какие 255 символов, хоть под 10 000 000 выдели, главное чтобы оперативки хватило.

Цитата(PRF @  6.12.2007,  19:17 Найти цитируемый пост)
 "Использовать массив указателей на массивы строк!!"

ну это просто:
например массив под 10 строк неопределенной длины:
Код

char *arrString[10] = {0}; //на всякий случай инициализируем элементы нулями
arrString[0] = new char[50];//память под 1-ю строку из 50 символов
strcpy( arrString[0], "50" ); //загоняем туда строку "50"
arrString[1] = new char[100];//память под 2-ю строку из 100 символов
strcpy( arrString[1], "100" ); //загоняем туда строку "100"
arrString[2] = new char[1000];//память под 3-ю строку из 1000 символов
strcpy( arrString[2], "1000" ); //загоняем туда строку "1000"

//...
//в конце нужно освободить память
delete []arrString[0];//освобождаем память из-под 1-й строки 
delete []arrString[1];//освобождаем память из-под 2-й строки 
delete []arrString[2];//освобождаем память из-под 3-й строки 


итого у нас тут массив указателей на строки из 10 элементов (его тоже можно сделать динамическим)
под первые три указателя мы выделили участки памяти различного размера, остальные не использовали, в конце память освободили.

Это сообщение отредактировал(а) zkv - 6.12.2007, 19:50
PM MAIL   Вверх
PRF
Дата 6.12.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



ага  понятно, вот только немного не так в задании, ну т.е я думал что это для всех одинаково!!!
Посмотри пожалуйста файл так в задании еще рисунок прилагается, как это должно выглядеть!!!


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  _______4.pdf 82,27 Kb
PM MAIL   Вверх
zkv
Дата 6.12.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(PRF @  6.12.2007,  20:11 Найти цитируемый пост)
ага  понятно, вот только немного не так в задании, ну т.е я думал что это для всех одинаково!!!
Посмотри пожалуйста файл так в задании еще рисунок прилагается, как это должно выглядеть!!!

то что я рассказывал относится ко второй задаче.
а по первой на форуме куча примеров, даже в этом разделе. Поищи по словам динамические линейные списки.
PM MAIL   Вверх
PRF
Дата 6.12.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



не,, я только про 2 задачу, а почему на рисунке используется указатель на указатель????
PM MAIL   Вверх
zkv
Дата 6.12.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(PRF @  6.12.2007,  20:32 Найти цитируемый пост)
а почему на рисунке используется указатель на указатель???? 

ты у меня спрашиваешь? 
Там написано одно, а нарисовано другое, откуда мне знать, что именно требуется?

если следовать рисунку, то принцип такой:
Код

char **arrString = new char *[3]; //память под 3 указателя
arrString[0] = new char[50];//память под 1-ю строку из 50 символов
strcpy( arrString[0], "50" ); //загоняем туда строку "50"
arrString[1] = new char[100];//память под 2-ю строку из 100 символов
strcpy( arrString[1], "100" ); //загоняем туда строку "100"
arrString[2] = new char[1000];//память под 3-ю строку из 1000 символов
strcpy( arrString[2], "1000" ); //загоняем туда строку "1000"
//...
//в конце нужно освободить память
delete []arrString[0];//освобождаем память из-под 1-й строки 
delete []arrString[1];//освобождаем память из-под 2-й строки 
delete []arrString[2];//освобождаем память из-под 3-й строки 
delete []arrString;//освобождаем память из-под указателей 

PM MAIL   Вверх
PRF
Дата 6.12.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



ага все спасибо, я просто думал может как то по другому!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.