lungtung Цитата: Но при использоффании указатель :
char* string = "12345678901234567890"; // даже 20 символофф длинее "Hello world";
strcpy(string,"Hello world") ; // ---> нихуя ненапрегаиццо, нах???
Советую тебе разобраться с переменными, как они объявляются, где располагаются.
Да и с типами переменных заодно. А так же со стеком, что и когда туда помещается.
char* string = "12345678901234567890";
Не вполне корректное объявление. В данном случае string - это всего лишь указатель расположенный в стеке. В него помещается адрес строки "12345678901234567890".
А где расположена эта строка? В секции констант. А где расположена строка "Hello world"? Там же. Более соответствующее действительности объявление будет выглядеть так:
const char* string = "12345678901234567890";
Твоя программа пытается произвести операцию записи в секцию только для чтения, за что получит "штраф" либо ещё на стадии компиляции, либо во время выполнения.
char string[] = "12345678901234567890";
strcpy(string,"Hello world") ;
При таком объявлении в стек помещается уже не указатель, а массив, который будет проинициализирован. Его размер будет определяться размером инициализирующей строки.
char string[100] = "12345678901234567890";
strcpy(string,"Hello world") ;
Тоже самой, только с заданным размером string (100). И учти, что если ты копируешь в локальную переменную больше, чем она может принять, то ты испортишь содержимое стека, и программа сделает "RunTime Error"
Есть ещё один вариант - глобальные переменные.
char string[] = "12345678901234567890";
void Function()
{
strcpy(string,"Hello world") ;
}
Здесь переменная string уже не в стеке, а в секции переменных, куда можно что то записывать.