2012-07-16 233 views
-2

我有一個關於strcpy()的問題。據我的理解,我認爲strcpy複製位於指針處的字節而不是指針本身。 但這段代碼似乎反應不同。strcpy()複製指針?

char* str2 = (char*) malloc(50) ; 
printf("str2:%d (%p), strTrim:%d (%p)", strlen(str2),*str2,strlen(strTrim),*strTrim) ; 
strcpy(str2,strTrim); 
printf("str2:%d (%p), strTrim:%d (%p)", strlen(str2),*str2,strlen(strTrim),*strTrim) ; 

我得到的輸出是:

str2: 64 (FFFFFFCD) , strTrim:8 (00000061) 
str2:8 (00000061) , strTrim:8 (00000061) 

現在,第一輸出線看起來很清晰。但是第二行讓我感到困惑。 爲什麼它將strTrim的指針複製到str2?我真的不明白。

+2

如果要打印指針的值,你應該只提供'str2'和'strTrim'到'printf'而不是'* str2'和'* strTrim'(它實際上會打印出存儲字符串的內存部分)。 – nhahtdh 2012-07-16 13:16:53

回答

4
char* str2 = (char*) malloc(50) ; 
strlen(str2); // undefined behavior, `str2` has an indeterminate value 

malloc之後分配的對象有一個不確定的值。您不能使用str2參數調用strlen:它還不是字符串。

廢止的第一個字節和str2將成爲一個指針(空)字符串:

str2[0] = '\0'; 
strlen(str2); // OK, strlen(str2) is 0 
+0

是的,謝謝,這是真的。我應該刪除那行代碼。但它仍然不能解決我的問題。 – 2012-07-16 13:17:52

+0

@MarianoDiMartino'* strTrim'和'* str2'等價於字符串的第一個字符'strTrim [0]'和'str2 [0]'。在調用'strcpy'之後,'strTrim [0]'和'str2 [0]'得到相同的值。 – ouah 2012-07-16 13:20:26

+0

要打印指針值,您需要'printf(「%p%p \ n」,strTrim,str2);'而不是'* strTrim'和'* str2'。 – ouah 2012-07-16 13:22:56