2014-11-01 2 views
1

Моя функция swapData основном обменивает данные между двумя узла типа CHAR *Valgrind - Неверная запись размера 1 для зЬгсру

17 void swapData(struct Node *node1, struct Node *node2) 
18 { 
19  // Create a new node "temp" that stores the data of node2 
20  struct Node *temp = (struct Node *)malloc(sizeof(struct Node)); 
21  temp->data = malloc(strlen(node2->data)); 
22  
23  strcpy(temp->data,node2->data); 
24  
25  // Copy data from node1 to node2 
26  strcpy(node2->data,node1->data); 
27  
28  // Copy data from temp to node1 
29  strcpy(node1->data,temp->data); 
30  
31  free(temp->data); 
32  free(temp); 
33 } 

Всякий раз, когда я бегу Valgrind, он продолжает давать мне этот выход:

==27570== Invalid write of size 1 
==27570== at 0x4C2C00F: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==27570== by 0x400794: swapData (test4.c:23) 
==27570== by 0x400A9C: sort (list2.c:20) 
==27570== by 0x40086B: main (test4.c:49) 
==27570== Address 0x51f11dd is 0 bytes after a block of size 13 alloc'd 
==27570== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==27570== by 0x40076B: swapData (test4.c:21) 
==27570== by 0x400A9C: sort (list2.c:20) 
==27570== by 0x40086B: main (test4.c:49) 
==27570== 
==27570== Source and destination overlap in strcpy(0x51f1130, 0x51f1130) 
==27570== at 0x4C2C085: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==27570== by 0x4007B2: swapData (test4.c:26) 
==27570== by 0x400A9C: sort (list2.c:20) 
==27570== by 0x40086B: main (test4.c:49) 
==27570== 
==27570== Invalid read of size 1 
==27570== at 0x4C2C002: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==27570== by 0x4007D0: swapData (test4.c:29) 
==27570== by 0x400A9C: sort (list2.c:20) 
==27570== by 0x40086B: main (test4.c:49) 
==27570== Address 0x51f11dd is 0 bytes after a block of size 13 alloc'd 
==27570== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==27570== by 0x40076B: swapData (test4.c:21) 
==27570== by 0x400A9C: sort (list2.c:20) 
==27570== by 0x40086B: main (test4.c:49) 
==27570== 

Я считаю, проблема в strcpy в swapData. Может ли кто-нибудь сказать мне, что происходит?

+0

Можете ли вы опубликовать структуру узла, а также как вы вызываете эту функцию. т.е. что вы проезжаете –

+0

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

+0

Хотя ответ @ Dere0405 является хорошим первым началом, из вашего кода невозможно узнать, безопасны ли другие вызовы 'strcpy', так как вы не разделили определение «Node». – vanza

ответ

7

Не только вы должны добавить его к своей длине malloc, но также вы не можете менять строки, используя strcpy, как вы делаете. Что делать, если первая строка была разделена на 10 байтов, а вторая с 29 байтами? Когда вы копируете для свопинга, вы перекрываете буфер первой строки. Лучше всего поменять указатели. Если data определяется как массив фиксированной длины, то то, что вы делаете, в порядке, но тогда temp также может быть массивом того же размера вместо узла.

+0

Если 'data' был определен как массив с фиксированной длиной, то' temp-> data = malloc (strlen (node2-> data)) ', дадут довольно серьезные проблемы. –

+0

Правда. Это означает, что код определенно нарушен. – JS1

10

Вам нужно таНос еще один байт для TEMP-> данных

temp->data = malloc(strlen(node2->data)+1); 

Это потому, что вам нужно последний байт для хранения, то «\ 0», указывающий на конец строки.

+0

Кроме того, всегда есть 'strdup'. И 'strndup'. – vanza

+0

@ Dere0405 спасибо, я добавил +1, и есть еще одна ошибка «Перемещение источника и места назначения в strcpy». См. Обновление! – viethaihp291

+0

на самом деле возникли некоторые другие проблемы, поэтому мне придется полностью просмотреть мой код, но спасибо за ответ! – viethaihp291

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