Обнаружено разрушение стека при попытке скопировать одну строку в другую с помощью указателей - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь скопировать одну строку в другую, используя указатели, но произошла ошибка разрушения стека при успешном копировании строки.

Вот код ниже,

#include <stdio.h>
void strcat(char *str1, char *str2) {
    char *run = str1;
    while(*run !='\0')
        run++;
    while(*str2 !='\0') {
        *run = *str2;
        run++;
        str2++;
    }
    *run = '\0';
}
int main() {
    char s[] = "hellomojo";
    char t[] = "world";

    printf("\ns :%s", s);
    printf("\n t :%s",t);
    strcat(s, t);
    printf("\ns after:%s",s);
}

Этоиз-за нелегального доступа к памяти, на которую не указывают указатели?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Этот char s[]="hellomojo"; в основном совпадает с char s[10]="hellomojo";.Это массив из 10 символов (включая NUL-терминатор).В нем нельзя хранить более 10 символов.Но вы объединяете другую строку с этим, записывая в недопустимые области памяти вне массива.Это вызывает неопределенное поведение .Отсюда проблема с разбиванием стека.

Исправление будет заключаться в увеличении размера первого массива, например:

char s[32] = "hellomojo"; /* 32 chosen arbitrary */
0 голосов
/ 09 июня 2018

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

Вы показываетекод, но что вывод и сообщение об ошибке?С большим количеством информации было бы легче отладить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...