【问题标题】:Why more string is added than allocated memory [duplicate]为什么添加的字符串比分配的内存多[重复]
【发布时间】:2017-01-18 11:24:31
【问题描述】:

下面是代码sn-p:

char *b = NULL;

b = new char[5];

if(b != NULL) {

    printf("b=%p\n",b);

    sprintf(b, "helloPLS...123456789123456789");

    printf("b = %s\n", b);
}

output : b = helloPLS...123456789123456789

如果只分配了 5 个字节,那么为什么所有“helloPLS...123456789123456789”字符串都被添加到 5 个字节的内存中?

我的程序运行良好。

【问题讨论】:

标签: c linux


【解决方案1】:

您正在写入超出分配的内存的末尾。 C 标准清楚地表明这种情况下的行为是未定义的。

未定义的行为并不意味着“总是崩溃”。这意味着它可能看起来有效。这意味着您的 C 运行时环境的实现有权做任何它想做的事情,并且仍然符合标准。

您应该小心注意未定义的行为,这正是因为您的程序可能“工作得非常好”,直到它不能正常工作为止。

【讨论】:

  • 如何知道上面代码中分配给“b”变量的大小是多少?因为 sizeof(b) 总是 4byte
  • @Logicbomb - 缓冲区大小需要在 C 中传递。没有办法绕过它。必须特别小心。
  • @Logicbomb 录下来或者加个终结者,没有别的办法。就是说 C++ 在你的 q 中被标记,如果你真的在使用 C++,你可能不应该使用 malloc()
  • ... 甚至char*。使用 std::string 并忘记必须自己处理内存。
  • 是的,我们使用的是 c++,但 new 运算符也会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2019-12-07
  • 2022-03-30
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多