簡體   English   中英

有關將char數組復制到char指針的基本C問題

[英]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 )。

其次, pstrstr指向相同的內存,因此您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM