Инициализация буфера char
От: CMaker  
Дата: 21.10.04 06:57
Оценка:
Объясните, пожалуйста, популярно, чем отличаются конструкции:
char * test = "some text";
и
char test[] = "some text";

в VisualC++ 6.0 если я пишу вот так:
memcpy(test, buffer, 10);

работает только вариант с "char test[]".
В противном случае пишется Access Violation exception.

Я раньше думал, что разницы между двумя конструкциями нету...
Re: Инициализация буфера char
От: korzhik Россия  
Дата: 21.10.04 07:03
Оценка:
Здравствуйте, CMaker, Вы писали:

CM>Я раньше думал, что разницы между двумя конструкциями нету...


здесь
Автор: Павел Кузнецов
Дата: 03.01.04
Re[2]: Инициализация буфера char
От: CMaker  
Дата: 21.10.04 07:15
Оценка:
Спасибо!
Re: Инициализация буфера char
От: jazzer Россия Skype: enerjazzer
Дата: 21.10.04 07:17
Оценка:
Здравствуйте, CMaker, Вы писали:

CM>Объясните, пожалуйста, популярно, чем отличаются конструкции:

CM> char * test = "some text";

ЗДЕСЬ ты объявляешь указатель и инициализируешь его адресом константной строчки, лежащей где-то, куда ее положил компилятор (т.е. какой-нть read-only сегмент бинарника, куда он складывает все встретившиеся ему в программе строковые литералы)

CM> char test[] = "some text";


а здесь ты объявляешь массив на стеке, который будет проинициализирован той самой константной строчкой, т.е. заполнится содержимым той константной строчки.
массив, тем не менее, лежит у тебя на стеке и доступен для модификаций.
Если этот массив объявляется в функции, то он создается при каждом входе в функцию и удаляется при выходе. С константной строчкой, очевидно, ничего при этом не происходит: она служит лишь для инициализации твоего массива.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Инициализация буфера char
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.10.04 07:25
Оценка:
Здравствуйте, korzhik, Вы писали:

CM>>Я раньше думал, что разницы между двумя конструкциями нету...


K>здесь
Автор: Павел Кузнецов
Дата: 03.01.04


+ 2.2. А разве char a[] не эквивалентно char* a ?
Автор: Кодт
Дата: 20.01.03
Re: Инициализация буфера char
От: _nn_ www.nemerleweb.com
Дата: 21.10.04 07:50
Оценка:
Здравствуйте, CMaker, Вы писали:

CM>Объясните, пожалуйста, популярно, чем отличаются конструкции:

CM> char * test = "some text";
CM>и
CM> char test[] = "some text";

CM>в VisualC++ 6.0 если я пишу вот так:

CM> memcpy(test, buffer, 10);

CM>работает только вариант с "char test[]".

CM>В противном случае пишется Access Violation exception.

CM>Я раньше думал, что разницы между двумя конструкциями нету...


Первую вообще писать нельзя в таком виде, надо так:
const char* test = "some text";

Так как тип у "some text" он const char*, а не char*.

А со вторым проблем нет, это объявление массива и его заполнение.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Инициализация буфера char
От: elcste  
Дата: 21.10.04 08:24
Оценка:
Здравствуйте, _nn_, Вы писали:

CM>> char * test = "some text";


__>Первую вообще писать нельзя в таком виде, надо так:


Почему нельзя? Это deprecated, но well-formed.
Re[3]: Инициализация буфера char
От: _nn_ www.nemerleweb.com
Дата: 21.10.04 08:27
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, _nn_, Вы писали:


CM>>> char * test = "some text";


__>>Первую вообще писать нельзя в таком виде, надо так:


E>Почему нельзя? Это deprecated, но well-formed.


Компилятор то скомпилирует, но при попытке записать значение могут возникнуть проблемы.
char* test = "some text";
test[0]=0; // бум !!! (хотя может и не быть :) )

Чтобы небыло таких проблем пишется всегда const char*, а если нужно менять то char[], или char* но тогда выделять память динамически.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Инициализация буфера char
От: BacCM Россия  
Дата: 21.10.04 10:44
Оценка:
Здравствуйте, CMaker, Вы писали:

CM>Объясните, пожалуйста, популярно, чем отличаются конструкции:

CM> char * test = "some text";
CM>и
CM> char test[] = "some text";


CM>Я раньше думал, что разницы между двумя конструкциями нету...


Я когда-то тоже думал даже использовал конструкции из какой-то "умной" книге по C вида;
  char*pchBuffer="Any int characters\0  And more bytes allocate for future using          ";

Все это прекрасно работало пока не пересел на некорое время в Linux...
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.