2012-07-16 69 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