Здравствуйте, CMaker, Вы писали:
CM>Объясните, пожалуйста, популярно, чем отличаются конструкции: CM> char * test = "some text";
ЗДЕСЬ ты объявляешь указатель и инициализируешь его адресом константной строчки, лежащей где-то, куда ее положил компилятор (т.е. какой-нть read-only сегмент бинарника, куда он складывает все встретившиеся ему в программе строковые литералы)
CM> char test[] = "some text";
а здесь ты объявляешь массив на стеке, который будет проинициализирован той самой константной строчкой, т.е. заполнится содержимым той константной строчки.
массив, тем не менее, лежит у тебя на стеке и доступен для модификаций.
Если этот массив объявляется в функции, то он создается при каждом входе в функцию и удаляется при выходе. С константной строчкой, очевидно, ничего при этом не происходит: она служит лишь для инициализации твоего массива.
Здравствуйте, 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>Я раньше думал, что разницы между двумя конструкциями нету...
Первую вообще писать нельзя в таком виде, надо так:
constchar* test = "some text";
Так как тип у "some text" он const char*, а не char*.
А со вторым проблем нет, это объявление массива и его заполнение.
Здравствуйте, elcste, Вы писали:
E>Здравствуйте, _nn_, Вы писали:
CM>>> char * test = "some text";
__>>Первую вообще писать нельзя в таком виде, надо так:
E>Почему нельзя? Это deprecated, но well-formed.
Компилятор то скомпилирует, но при попытке записать значение могут возникнуть проблемы.
char* test = "some text";
test[0]=0; // бум !!! (хотя может и не быть :) )
Чтобы небыло таких проблем пишется всегда const char*, а если нужно менять то char[], или char* но тогда выделять память динамически.