Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Размер указателя


Автор: PRF 6.12.2007, 18:00
[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!!???
Помогите!!!
Заранее спасибо!!!

Автор: zkv 6.12.2007, 18:31
если говорить строго, то в этом примере:
Код

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 это http://www.thescripts.com/forum/thread556123.html  smile Посоветуй почитать Страуструпа.

Автор: PRF 6.12.2007, 19:17
Цитата

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

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

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

Задача!!!

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

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

char* ukaz = new char[255];

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

Автор: zkv 6.12.2007, 19:49
какие 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 элементов (его тоже можно сделать динамическим)
под первые три указателя мы выделили участки памяти различного размера, остальные не использовали, в конце память освободили.

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

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

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

Автор: PRF 6.12.2007, 20:32
не,, я только про 2 задачу, а почему на рисунке используется указатель на указатель????

Автор: zkv 6.12.2007, 20:43
Цитата(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;//освобождаем память из-под указателей 

Автор: PRF 6.12.2007, 20:48
ага все спасибо, я просто думал может как то по другому!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)