2013-09-27 1 views
6

Я пытаюсь скомпилировать и написать код, написанный на C под linux, и получил это сообщение об ошибке: glibc обнаружено malloc(): повреждение памяти, и я не могу понять, почему ...glibc обнаружено malloc(): повреждение памяти в C

Подстрока() просто возвращает часть оригинальной строки, указав начальный индекс и длину. например подстрока («это пример», 0,4) = «это»;

char *substring(char* str, int start, int length) { 
    char *newString = (char *)malloc(length * sizeof(char)); 
    int i, x = 0; 
    int end=start+length-1; 
    for(i = start ; i <= end; i++){ 
     newString[x++] = str[i]; 
    } 
    newString[x] = '\0'; 
    return newString; 
} 

и getCharIndexFirst() просто возвращает индекс первого совпадения заданного полукокса getCharIndexLast() просто возвращает индекс последнего совпадения заданного полукокса

и ниже является основной функцией:

//consoleCommand has the form of 'send MESSAGE ID', has the value from stdin 

int firstSpace = getCharIndexFirst(consoleCommand,' '); 
int lastSpace = getCharIndexLast(consoleCommand,' '); 
int len = strlen(consoleCommand); 

char *header = substring(consoleCommand,0,firstSpace); 
printf("header is: %s\n",header); 
char *cmd = substring(consoleCommand,firstSpace+1,lastSpace-firstSpace-1); 
printf("command is: %s\n",cmd); // the code only runs up to here and output the error.. 
char *socketstr = substring(consoleCommand,lastSpace+1,len-lastSpace-1); 
printf("socket is: %s\n",socketstr); 

Вот еще информация: consoleCommand обычно STDIN, имеет форму «отправить сообщение ID», ошибка возникает, когда сообщение 12 голец долго ... , например. 'отправить это сообщение 4', 'это сообщение' является cmd и имеет длину 12 символов, это дает мне ошибку! , и он отлично работает для любой другой длины, я пробовал 3, 4, 24 ...

Любой намек будет оценен, СПАСИБО!

+2

Научитесь использовать [valgrind] (http://valgrind.org/) и скомпилировать все предупреждения и debug ingo (например, 'gcc -Wall -g'). Используйте отладчик 'gdb'. –

ответ

5

Вы не выделяете пространство для завершающего символа '\0', поэтому вы переполняете свое выделение, чтобы написать этот символ. Вы должны считать этот символ в своем распределении тоже:

char *newString = (char *)malloc((length + 1) * sizeof(char)); 
+0

Большое вам спасибо !!! omg im просто слишком слепой, чтобы поймать это ... большое спасибо !!! –

+0

@HughH sizeof (char) == 1 и бессмысленно. * Инструмент *, чтобы найти такую ​​ошибку, - это Valgrind - это будет указывать на ошибку. –

12
newString[x] = '\0'; 

На данный момент x равно length, что означает, что вы пишете 1 символ за конец памяти вы выделяемой. Вам нужно выделить место для еще одного символа.