2016-10-29 2 views
0

Я использовал этот код, чтобы соединить две строки в C:«Stack Smashing обнаружен» при конкатенации строк в C

int main(int argc, char** argv) { 

    char a[] = "hello "; 
    char b[] = "world"; 

    concat(a, b); 
    printf("%s\n", a); 

    return (EXIT_SUCCESS); 
} 

void concat(char s[], char t[]){ 
    int i, j; 
    i = j = 0; 
    while (s[i] != '\0') i++; 

    while ((s[i++]=t[j++]) != '\0'); 

} 

Строка была каскадной правильно, но следующая строка в выводе был:

*** stack smashing detected *** [...] terminated 

Почему этот код был обнаружен как разбитый стек?

+0

Если вы пишете C, то почему вы использовали тег C++? И где ваш [MCVE]? И как '' 'достаточно места для содержимого' a' и 'b'? –

+0

'a' не хватает места для хранения новой строки – ForceBru

ответ

1

Строки в C заданы длиной, поэтому вы не можете добавить что-то к ним. Вы должны создать новый и скопировать оба. Ошибка запускается, потому что вы пишете пространство, которое не было выделено вам. У вас всего 7 байт, но вы пишете 8-й, 9-й ... 12-й байт, таким образом, записывая другие данные программы (разбивая стек).

#include <string.h> 
char* concat(char s[], char t[]){ 
    int i, j; 
    i = j = 0; 
    char* u = (char*)malloc(strlen(s) + strlen(t)+1);//new string with enough space for both and \0 
    while (s[i] != '\0') { 
     u[i]=s[i]; 
     i++; 
    } 
    while ((u[i++]=t[j++]) != '\0'); 
    return u; 
} 
1
char a[] = "hello "; 

Объявляет char массив ровно 7 элементов, шести символов плюс \0. Нет никакого места для того, чтобы быть объединенным.

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

char a[12] = "hello "; 
+0

Немного вводит в заблуждение, поскольку« добавление »по определению будет _make_ этой комнаты. Фактическая проблема заключается в том, что добавление не происходит, потому что C не добавляет _have_. –

+1

Спасибо за ответ. Но что именно это вызвало ошибку разбиения стека - это был акт присвоения чего-либо индексу массива, который больше его длины-1? –

Смежные вопросы