問題:
請分析下面代碼的輸出結果:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char*p1 = "China";
char*p2, *p3;
p2= (char*)malloc(20);
memset(p2,0, 20);
while(*p2++= *p1++);
printf("%s\n",p2);
getchar();
}
輸出結果:輸出爲空!
代碼的本意是將p1字符串的字符複製到p2指針所指向的內存區域。但是在語句while(*p2++ = *p1++);中,在指針p1增加的時候,指針p2也跟着增加了。所以實際上在賦值之後,p2也指向了“China”字符串的下一個地址處。
總結:
1. p指針的幾種操作
++(*p):先取出p指針所指向的內容,然後自增1,當前生效;
(*p)++:先取出p指針所指向的內容,然後自增1,該語句執行後生效;
*(p++):p指針+1,取出+1之前指針指向的內容;
*(++p):p指針+1,取出+1後指針指向的內容。
2. malloc函數
Malloc 向系統申請分配指定size個字節的內存空間。返回類型是void* 類型。void*表示未確定類型的指針。C,C++規定,void*類型可以強制轉換爲任何其它類型的指針。
2.1 功能
分配長度爲num_bytes字節的內存塊。
2.2 返回值
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
2.3 說明
關於該函數的原型,在舊的版本中malloc返回的是char型指針,新的ANSIC標準規定,該函數返回爲void型指針,因此必要時要進行類型轉換。
2.4 名稱解釋
malloc的全稱是memoryallocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
2.5 頭文件
<stdlib.h>
3. memset函數
將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值, 塊的大小由第三個參數指定,這個函數通常爲新申請的內存做初始化工作, 其返回值爲指向S的指針。
3.1 函數介紹
void *memset(void *s, int ch, size_t n);
3.2函數解釋
將s中前n個字節(typedefunsigned int size_t)用 ch 替換並返回s 。
3.3 函數作用
在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。
3.4 頭文件
<string.h>