指针
参数传递
下列程序是否正确:
1 2 3 4 5 6 7 8 9 10 11
| void GetMemory(char *p) { p = new char[100]; } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); }
|
错误,程序崩溃。因为GetMemory 并不能传递动态内存, Test 函数中的 str
一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。
1 2 3 4 5 6 7 8 9 10 11
| char* GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); }
|
可能返回乱码。因为GetMemory
返回的是指向“栈内存”的指针,该指针的地址不是
NULL,但其原现的内容已经被清除,新内容不可知。
1 2 3 4 5 6 7 8 9 10 11
| void GetMemory2(char **p, int num) { *p = new char[num]; } void Test(void) { char *str = NULL; GetMemory2(&str, 100); strcpy(str, "hello"); printf(str); }
|
能正常运行,但是内存泄漏。
1 2 3 4 5 6 7 8 9 10 11
| oid Test(void) { char *str = new char[100]; strcpy(str, "hello"); delete[ ] str; if (str != NULL) { strcpy(str,"world"); printf(str); } }
|
篡改动态内存区的内容,后果难以预料,非常危险。因为 delete[
]str;之后,str成为野指针(需要str = NULL;)if(str !=
NULL)语句不起作用。
编程
不用C++库函数,自行实现strcpy
1 2 3 4 5 6 7 8
| char *strcpy(char *strDest, const char *strSrc); { assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ) ; return address ; }
|