[英]Basic C question on copying char arrays to char pointers
我對基本C編程有一些疑問。
我有一個char數組,我必須將其復制到char指針。 所以我做了以下事情:
char a[] = {0x3f, 0x4d};
char *p = a;
printf("a = %s\n",a);
printf("p = %s\n",p);
unsigned char str[] = {0x3b, 0x4b};
unsigned char *pstr =str;
memcpy(pstr, str, sizeof str);
printf("str = %s\n",str);
printf("pstr = %s\n",pstr);
我對pstr和str的printf語句附加了數據“ a”。 如果刪除memcpy,我會成為垃圾。 某些C大師可以啟發我嗎?
首先,C字符串( printf
的%s
)應為NUL終止。 您錯過了終結者。 嘗試使用char a[] = {0x3f, 0x4d, 0}
( str
)。
其次, pstr
和str
指向相同的內存,因此您的memcpy
是no-op。 與第一個相比,這是次要的一點。
添加一個空終止符,因為這是您期望的printf:
char a[] = {0x3f, 0x4d, '\0'};
C字符串的標准表示方式是在內存中,它們是表示字符的一系列非零字節,后跟一個零(或NULL)字節。 您應該聲明:
char a[] = {0x3f, 0x4d, 0};
當您分配一個字符串指針(如unsigned char *pstr = str;
)時,兩個指針都指向相同的存儲區,因此指向相同的字符。 無需復制字符。
當確實需要復制字符時,應該使用strlen()
, sizeof()
運算符返回其參數在內存中使用的字節數。 sizeof(pointer)
是指針使用的字節數,而不是字符串的長度。 您可以使用strlen()
函數找到字符串的長度(即,它在內存中占用的字節數strlen()
。 另外,還有一些標准函數可以復制C字符串。 您應該依靠那些來做正確的事情:
strcpy(pstr, str);
printf
的%s
期望以0結尾的字符串,但您的字符串不是。 但是,數組之后的未初始化內存可能恰好以0字節開頭,在這種情況下,您的代碼似乎是正確的-仍然不是。
您要聲明一個數組“ str”,然后使用pstr指向它。 請注意,您沒有空終止符,因此在使用memcpy之后,您需要將一個無空終止符的塊復制到自身,這是字符串要求 。 因此,printf找不到字符串的末尾並繼續打印,直到找到0(或用字符表示的'\\ 0')為止
同意。 您必須在字符數組的末尾添加一個空字節。
char a[] = {0x3f, 0x4d, '\0'};
原因是您在創建字符串時未聲明其實際結束位置。 您的memcpy()函數將* str復制到* pstr並自動為您添加一個空字節,這就是它起作用的原因。
如果沒有memcpy(),該字符串將永遠不知道何時結束,因此它會到達后續的內存地址並返回存儲在那里的任何隨機值。 當使用字符創建字符串時,請始終記住以空字節結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.