【问题标题】:Strcpy() copying pointer?strcpy() 复制指针?
【发布时间】:2012-07-16 13:11:44
【问题描述】:

我有一个关于 strcpy() 的问题。据我了解,我认为 strcpy 复制位于指针处的字节而不是指针本身。 但是这段代码的 sn-p 似乎反应不同。

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 ?我真的不明白。

【问题讨论】:

  • 如果您要打印指针的值,您应该只向printf 提供str2strTrim 而不是*str2*strTrim(这实际上会打印出存储字符串的内存的一部分)。

标签: c strcpy


【解决方案1】:
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

【讨论】:

  • 是的,谢谢,这是真的。我应该删除那行代码。但它仍然没有解决我的问题。
  • @MarianoDiMartino *strTrim*str2 等价于 strTrim[0]str2[0],这是字符串的第一个字符。调用 strcpy 后,strTrim[0]str2[0] 的值相同。
  • 要打印您需要的指针值printf("%p %p\n", strTrim, str2); 而不是*strTrim*str2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2018-01-18
  • 2017-03-30
  • 1970-01-01
相关资源
最近更新 更多