K&R Упражнение 5-3: Объявление указателей и массивов

Я работаю над языком программирования K&R C и в настоящее время работаю над главой 5 (указатели). У меня проблема с упражнением 5-3:

«Напишите версию функции strcat, показанную в главе 2, с указателем: strcat(s,t) копирует строку t в конец s».

Я написал код ниже:

#include<stdio.h>

void pointer_strcat(char *stringOne, char *stringTwo);

main(){

char *initialString = "Flash. ";
char *middleString = "Welcome.";  
char *addedString  = "Thunder.";

pointer_strcat(initialString, addedString);
printf("%s \n", initialString);

} 

void pointer_strcat(char *stringOne, char *stringTwo){

while(*stringOne++ != '\0'){
}
*stringOne--;
while( (*stringOne = *stringTwo) != '\0'){
    stringOne++;
    stringTwo++;
}
}

Я пытался внимательно следовать примерам в этой главе, но всякий раз, когда я запускаю этот код, происходит зависание, и я получаю всплывающее окно, в котором говорится, что .exe перестал работать, прежде чем вернуться в командную строку. Я возился с кодом в разные стороны и обнаружил, что если я изменю объявления указателей строк на массивы (*initialString становится initialString[]), все работает именно так, как я хочу. Меня это особенно раздражает, потому что на странице 83 написано:

"Как формальные параметры в определении функции, char s[]; и char *s; эквивалентны;..."

Мне действительно не помешал бы совет, почему эти разные объявления имеют такую ​​радикально разную производительность при запуске .exe, хотя обе версии компилируются.


person Yusif_Nurizade    schedule 24.07.2014    source источник
comment
Правильный отступ вашего кода — это всегда хорошее начало.   -  person Jonathon Reinhart    schedule 24.07.2014
comment
@dohashi Отличная находка. Точный.   -  person Jonathon Reinhart    schedule 24.07.2014
comment
Извините, но у меня есть дополнительный вопрос к предоставленному ответу, и я не могу добавить комментарий, пока не наберу 50 повторений. Принятое решение состоит в том, что объявления указателя не выделяют достаточно памяти и что требуются массивы, достаточно большие, чтобы содержать обе строки. Я считаю, что решение идет array1 [20], array2 [20]. Почему мое объявление без размера arrayOne[] работает? Есть ли достаточно большое значение по умолчанию?   -  person Yusif_Nurizade    schedule 25.07.2014
comment
@Yusif_Nurizade Если вы имеете в виду что-то вроде этого char arrayOne[] = "hello world";, это будет потому, что вам разрешено объявлять массив без размера, если вы его инициализируете, поскольку компилятор определит необходимое пространство по количеству предоставленных инициализаторов.   -  person Shafik Yaghmour    schedule 25.07.2014
comment
@ShafikYaghmour спасибо за ответ. Чем отличается определение компилятором необходимого пространства между char arrayOne[] = hello world; и char *arrayOne = привет, мир;? Часть, которая меня застряла, заключается в том, что оба дают одинаковое количество инициализаторов, но один работает, а другой нет.   -  person Yusif_Nurizade    schedule 25.07.2014
comment
@Yusif_Nurizade, как я объясняю здесь, объявление arrayOne = "hello world"; преобразует строковый литерал в указатель на строковый литерал, который нельзя изменить. Во втором случае у вас есть массив, и в него копируется строковый литерал.   -  person Shafik Yaghmour    schedule 25.07.2014
comment
@ShafikYaghmour, я думаю, это одна из тех вещей, которые мне просто нужно принять. Я понимаю, что одно из них можно изменить, а другое - нет по их определениям, но меня постоянно смущает тот факт, что в книге говорится, что объявления одинаковы. Спасибо за попытку.   -  person Yusif_Nurizade    schedule 25.07.2014