2013-07-10 6 views
0

Я пытаюсь создать функцию, которая приписывает строку после другой строки. Я наблюдаю следующую ошибку. Пожалуйста помоги. * Glibc обнаружен ./a.out: перераспределить(): недопустимый старый размер: 0x00007fff7af0d450 * *Ошибка при конкатенации строки

// The following code concatenates the orignal string into the another 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

void strcatstring(char *str,char *newstr) 
{ 
    int m=strlen(str); 
    int n=strlen(newstr); 

    newstr=(char *)realloc(newstr,10*sizeof(char)); 
    char *newstr1=(char *)malloc(10*sizeof(char)); 
    newstr1=newstr; 

    while(*newstr!='\0') 
    { 
     ++newstr; 
    } 
    while(*str!='\0') 
    { 
     *newstr=*str; 
     ++newstr; 
     ++str; 
    } 

    printf("%s",newstr1); 
} 


int main() 
{ 
    int n=6;char *str;char str1[10]; 
    str1[0]='y'; 
    str1[1]='u'; 

    str=(char *)malloc(n*sizeof(char)); 
    printf("\nEnter the string\n"); 
    scanf("%s",str); 
    puts(str); 
    strcatstring(str,str1); 

    return 0; 
} 
+1

первый отступ ваш код правильно –

+0

Пожалуйста, просмотрите [вы с отступом код и уведомление] (http://stackoverflow.com/posts/17569539/revisions), где @Kninnug поместил вкладки –

ответ

2

Проблема заключается в том, что вы пытаетесь перераспределить память, не выделяются (в пути realloc хочет его) в первую очередь.

Вы объявляете str1 как массив в функции main, эта память будет выделена в стеке компилятором, а не кучей. Функция realloc может перераспределять память, выделенную в куче, либо на malloc, calloc, либо на более ранний вызов realloc.

И если realloc вызов работал бы, то у вас есть утечка памяти, как вы выделить память и присвоить его newstr1 и в следующей строке перезаписать newstr1 указатель с newstr указателем.

И вы действительно не должны выделять фиксированный размер, помните, что вы добавляете одну строку размера m в строку размера n. Подумайте, что произойдет, если m + n больше 9. Это приводит к следующей проблеме: вы не завершаете полученную строку, так как вы не копируете завершающий символ '\0'.

+0

отлично. Вы очистили мое еще одно сомнение относительно того, почему не было ошибки, когда я объявлял str1, используя malloc. Большое спасибо за ваш ответ – Akshit

0

Попробуйте передать указатель на указатель во время вызова следующим

strcatstring(str,&newstr); 
0

str1 вы используете не может быть окончание с «\ 0». Вы должны вручную поставить этого персонажа в конце.

Вы не можете перераспределить память, выделенную в стеке. str1 выделяется в стеке.

Правильный strcat() имеет аргументы в другом порядке. Назначение на первом месте.

Ваше соглашение об именах ужасно. str? newstr? Как насчет source и destination. Более того, m и n ничего не говорят. Почему не sourceLen и destinationLen?

После завершения цикла в strcatstring() вы не ставите символ «\ 0» в конце. Скорее всего, вы получите ошибки памяти, используя эту строку.

0

Ваш str1 - это массив, выделенный в стеке. realloc() должен использоваться на указателе, пространство которого выделено в куче.

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