【问题标题】:strncpy behaviour in different IDEs不同 IDE 中的 strncpy 行为
【发布时间】:2017-12-07 12:32:27
【问题描述】:

我想知道为什么在带有内部 CDT 构建器的 Eclipse 中我可以做到这一点

char *data = 0;
char data2[20] = "Hello";

strncpy(data, data2, 10);

但在视觉工作室我必须这样做

char *data = malloc(20);
char data2[20] = "Hello";

strncpy(data, data2, 10);

如您所见,我必须在 Visual Studio 中使用 malloc(),否则我会遇到内存访问冲突,但为什么在 Eclipse 中不需要它?

【问题讨论】:

  • 第一个 sn-p 指向undefined behavior。故事结束。
  • 对不起,我真的没有。如果我知道我不会问...
  • @Someprogrammerdude 解释为什么这是 UB 会更有帮助,就像在下面的答案中所做的那样。
  • 没有CDT的segfault还是很奇怪的。
  • @Gerhardh 也许可以,但我从未见过这样的实现,我怀疑这是否方便。

标签: c string memory malloc


【解决方案1】:

对于大多数情况

  char *data = 0;

相同
  char *data = NULL;

然后,您使用NULL 指针(即,您不应该访问无效 地址)作为strncpy() 的目标.是undefined behavior

详述于C11,第 7.1.4 章,库函数的使用

[....] 如果函数的参数具有无效值(例如值 函数域外,或程序地址空间外的指针, 或者一个空指针,或者一个指向不可修改存储的指针,当对应的 参数不是 const 限定的)或函数不期望的类型(提升后) 使用可变数量的参数,行为未定义。 [...]

【讨论】:

  • 即使技术上是UB,但它没有与CDT发生段错误仍然很奇怪。
  • @MichaelWalz 好吧,在所有人中,您非常清楚先生,UB 的 美丽 方面。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多