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問題
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問題
strlen只計算沒有終止符'\ 0'的字符。 沒有此終結符printf不知道字符串的結尾。
解決方案: memcpy(s,a,(strlen(a)+1));
您首先分配內存,然後通過使用字符串文字重新分配指針來丟棄內存。您的參數calloc()
也顯得非常錯誤。
另外,memcpy()
不是字符串複製功能,它不包含終止符。您應該使用strcpy()
。
只打印數據的最佳方式,似乎是
puts("DATA");
你需要你想做的事更加清晰,以獲得與指針/分配/複製的幫助。
C中的字符串由零字符值(nul)終止。
strlen返回零之前的字符數。
所以你沒有複製零。
printf繼續前進,在s之後打印內存中的任何內容,直到達到零。
你也只是創建一個大小爲1的緩衝區,所以你正在寫數據在s之後的任何內容中,並且在你設置字面值之前將內存calloc'd泄漏到了a。
找到字符串的長度後,爲s分配內存,再分配一個字節以包含nul終止符,然後將a複製到s中。在存儲文字「DATA」之後,您不需要爲C運行庫查找任何內容。
您正在爲1個字符保留空間,因此當您正在寫入「DATA」(這是4個字符+尾隨的\0
以標記字符串末尾)時,實際上是使用其他某個變量的內存。
a=(char *)calloc(1,(sizeof(char)));
在這個例子中,你將需要5個以上的字符:
a=(char *)calloc(5, (sizeof(char)));
你需要一個終止\0
存儲DATA
字符串,所以printf()
知道停止打印後。
您可以用strcat
取代memcpy
:
strcat(s, a);
應該這樣做。
注意,但是,有一個bug早些時候:
calloc(1,sizeof(char))
將只分配一個字節!這當然不夠!根據實施情況,您的程序可能會或可能不會崩潰。
你
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不適合任何地方。
謝謝....它幫助 – SPB 2010-07-06 12:39:21