2014-09-23 2 views
0
char* StrCat(char* dest, char* source) 
{ 
    char* retVal = dest; 

    while(*dest) 
     dest++; 

    while(*dest++ = *source++) ; 

    return retVal; 
} 

int main() 
{ 
    char* a = "One"; 
    char* b = "Two"; 

    char* x = StrCat(a, b); 

    printf("%s\n", x); 

    return 0; 
} 

Программа вылетает в первый раз при копировании из источника в пункт назначения, второй цикл while. (Access violation)Что не так с этой функцией конкатенации?

+3

Сначала скажите мне, что правильно с этой функцией конкатенации (что вы думаете)? – haccks

+0

Почему вы не используете функцию 'strcpy' из' string.h'? –

+0

Похоже, он учится C. Хорошо попробовать перепрограммировать strcat вручную без какой-либо помощи libc. – superjedi

ответ

2

Содержимое переменных a и b (символьные строки «Один» и «Два») хранятся в сегментах только для чтения, содержимое защищено, вы не можете перезаписывать свои данные.

Плюс, функция StrCat() имеет мало логики.

Вы должны были бы использовать глобальный символ массив или обугленных массива, который вы передаете в функцию, которая имеет ограниченный размер и убедитесь, что вы не выходите за пределами своего размера буфера во время копирования, иначе вы закончите переполнение стека.

Другим решением было бы распределить память динамически, используя malloc, эта память должна быть освобождена, когда она вам больше не понадобится.

Переосмыслить, как вы могли бы написать такую ​​функцию для ее исправления, но сначала исправить эту проблему с памятью.

+2

a и b не сохраняются в сегментах только для чтения. На что они указывают. –

+0

Полностью верно - Спасибо за комментарий Том. – superjedi

+0

Это не будет переполнение стека, это будет UB. –