【问题标题】:assignment of string using strcpy and equal operator [closed]使用 strcpy 和等号运算符分配字符串 [关闭]
【发布时间】:2013-09-18 23:37:38
【问题描述】:

下面的代码有什么区别?

1.

char *p;
strcpy(p,"String");

2.

char *p;
p = "String";

指针指向同一个字符串,但是有区别吗?

【问题讨论】:

    标签: c pointers strcpy


    【解决方案1】:

    (1) 是内存乱写,可能是运行时错误。

    你不能复制到你不拥有的内存(没有以某种方式分配)。

    【讨论】:

      【解决方案2】:

      为了使第一个操作起作用,p 必须指向一个至少 7 字节大小的可写内存块。第二个操作不需要它。

      在第一次操作之后,字符串仍然是可写的:你可以对第一个字符串执行此操作,但不能对第二个字符串执行此操作:

      *p= 's'; // Make the value all lowercase
      

      第二个指针赋值将p指向一个字符串字面量的内存;写入该内存是未定义的行为。

      【讨论】:

      • @MitchWheat 你是对的 :)
      • 加上你的是更好的答案。
      • 如果您说 p = "" 是否适用?空字符串是否被视为只读内存中的字符串文字?
      • @rasen58 是的,"" 是只读内存中的字符串文字。它占用一个字节,即'\0'。写入它是 UB。
      【解决方案3】:

      在第一点你说你想把字符串复制到 p 指向的内存块

      (所以你必须确保有足够的空间可以复制字符串)

      在第二种情况下,您只需让 p 指向“String”的只读地址。

      p -> [S][t][r][i][n][g][0]

      但你应该得到编译器警告,只要你没有将 p 声明为 p const *

      【讨论】:

      • 因此在第一个字符串中被复制到另一个位置,然后将地址分配给指针。但是在 String 的第二个直接地址被分配给 p。
      猜你喜欢
      • 2014-04-08
      • 2014-01-19
      • 2012-08-11
      • 2013-05-30
      • 2018-11-10
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多