我swapData功能基本類型char兩個節點之間進行數據交換*Valgrind的 - 爲的strcpy
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==
我相信問題是在swapData中的strcpy。有人能告訴我發生了什麼事嗎?
你可以發佈節點的結構,以及你如何調用這個函數。即你通過了什麼 – 2014-11-01 03:26:44
如果你在內存之外寫入數據,即在你的內存範圍之外,則顯示這個錯誤 – 2014-11-01 03:29:21
雖然@Dere0405的回答是一個好的開始,但是從代碼中不可能知道其他'strcpy'調用是否安全,因爲你沒有共享'Node'定義。 – vanza 2014-11-01 03:34:11