2010-07-06 106 views
3
char *a=NULL; 

char *s=NULL; 

a=(char *)calloc(1,(sizeof(char))); 

s=(char *)calloc(1,(sizeof(char))); 

a="DATA"; 

memcpy(s,a,(strlen(a))); 

printf("%s",s); 

你能告訴我爲什麼要打印DATA½½½½½½½½■ε■????怎麼打印數據?謝謝有memcpy問題

回答

2

strlen只計算沒有終止符'\ 0'的字符。 沒有此終結符printf不知道字符串的結尾。

解決方案: memcpy(s,a,(strlen(a)+1));

+0

謝謝....它幫助 – SPB 2010-07-06 12:39:21

2

您首先分配內存,然後通過使用字符串文字重新分配指針來丟棄內存。您的參數calloc()也顯得非常錯誤。

另外,memcpy()不是字符串複製功能,它不包含終止符。您應該使用strcpy()

只打印數據的最佳方式,似乎是

puts("DATA"); 

你需要你想做的事更加清晰,以獲得與指針/分配/複製的幫助。

6

C中的字符串由零字符值(nul)終止。

strlen返回零之前的字符數。

所以你沒有複製零。

printf繼續前進,在s之後打印內存中的任何內容,直到達到零。

你也只是創建一個大小爲1的緩衝區,所以你正在寫數據在s之後的任何內容中,並且在你設置字面值之前將內存calloc'd泄漏到了a。

找到字符串的長度後,爲s分配內存,再分配一個字節以包含nul終止符,然後將a複製到s中。在存儲文字「DATA」之後,您不需要爲C運行庫查找任何內容。

1

您正在爲1個字符保留空間,因此當您正在寫入「DATA」(這是4個字符+尾隨的\0以標記字符串末尾)時,實際上是使用其他某個變量的內存。

a=(char *)calloc(1,(sizeof(char))); 

在這個例子中,你將需要5個以上的字符:

a=(char *)calloc(5, (sizeof(char))); 
1

你需要一個終止\0存儲DATA字符串,所以printf()知道停止打印後。

您可以用strcat取代memcpy

strcat(s, a); 

應該這樣做。

注意,但是,有一個bug早些時候:

calloc(1,sizeof(char)) 

將只分配一個字節!這當然不夠!根據實施情況,您的程序可能會或可能不會崩潰。

1

a="DATA"; 

象垃圾一樣清除的指針分配的內存。它不會將「DATA」複製到內存中。但是,這將不足以存儲它,因爲

a=(char *)calloc(1,(sizeof(char))); 

分配一個字符。而

memcpy(s,a,(strlen(a))); 

將現在由(字符串文字「DATA」)指向的內容拷貝到由s指向的內存中。但s又指向分配的單個字符,並且複製多個字符將覆蓋某些內容並導致錯誤。

strlen(a)給你4(「DATA」的長度)和memcpy正好拷貝4個字符。但要知道一個字符串結束的位置,C使用約定將最後的「null」字符('\ 0')放到末尾。所以在記憶中,「DATA」的確是'D''A''T''A''\'。

所有與字符串相關的函數都需要空字節,並且它們不會停止打印,直到找到它。

要複製字符串,請改爲使用strcpy(或strncpy),它會將字符串與其最終的空字節一起復制。 (因爲你可以溢出目標緩衝區,因此strcpy不太「安全」)。

但是我在這裏可以看到的最大問題是,你只保留一個字符(然後你垃圾它)和s,所以DATA \ 0不適合任何地方。