【问题标题】:Problems with allocating memory in c++在 C++ 中分配内存的问题
【发布时间】:2016-06-19 16:52:14
【问题描述】:

很遗憾,我不得不承认我一直在尝试自学 c++,但在指针方面我真的很困惑。

有人可以向我解释为什么这不起作用吗?我没有遇到任何分段错误。它编译我什么也没得到。

#include <iostream>
#include <cstdlib>
#include <cstring>
int main(){
  void *buffer = new char[8];
  memset( (char*)&buffer, 'a', sizeof(buffer) );
  std::cout << (char*)buffer <<std::endl;
  return 0;
}

【问题讨论】:

  • 你不走运。我得到了Segmentation Fault
  • 尝试从缓冲区中删除 &。它已经是一个指针。您正在获取指针的地址
  • "我没有遇到任何分段错误。它编译我什么也得不到。" -- 编写 C++ 时必须意识到的第一件事(或最早)之一代码是 1) 编译好的代码并不意味着程序是好的,并且 2) C++ 有一个称为 未定义行为 的概念。这就是你的代码所展示的。
  • sizeof 告诉您一个类型占用的字节数。所以你所做的只是说sizeof(void *),通常是 4 或 8。
  • @mreff555 您的代码存在多个问题。答案涵盖了大多数,其中一个(到目前为止)没有提到是你没有打电话给delete [] buffer;。尽管这是一个玩具程序,但不要养成分配内存的坏习惯,也不要担心释放它。

标签: c++ pointers memory allocation


【解决方案1】:

空指针非常棘手,通常不使用。我只是将其设为 char * 指针,而不使用缓冲区的引用。指针的名字是整个内存位置的引用。

这里是 memset 函数的一个很好的参考:http://www.cplusplus.com/reference/cstring/memset/

祝你好运。看起来你大部分时间都在工作。

【讨论】:

  • 您的意思是 void 指针而不是 Null 指针吗?无论哪种方式,它们的使用在正确的上下文中都很常见。
  • 我做到了,哎呀。我会编辑那个。大脑上的空指针。谢谢布赖恩。
【解决方案2】:

我看到以下问题。

问题 1

memset( (char*)&buffer, 'a', sizeof(buffer) );

这是传递给memset 的错误地址。你需要使用:

memset( buffer, 'a', sizeof(buffer) );

问题 2

sizeof(buffer) 计算为指针的大小(32 位平台为 4,64 位平台为 8)。您需要使用数组的长度,即8

memset( buffer, 'a', 8 );

问题 3

std::cout << (char*)buffer <<std::endl;

仅当buffer 是一个空终止字符串时才有效。如果使用memset,则所有有效内存都设置为a。因此,字符串不是以空结尾的。

您需要确保 buffer 以空值结尾。

buffer[7] = '\0';
std::cout << buffer <<std::endl; // No need for explicit cast

【讨论】:

  • 感谢 R Sahu。就“问题 3”而言,我实际上是在尝试防止以空字符结尾的字符串。但是,我不知道 cout 在这些条件下不会工作。假设我知道它应该有多大,有没有办法打印非空终止的类型指定信息?
【解决方案3】:
  1. 你复制到buffer的地址。但是buffer 保存了缓冲区的地址。所以你复制到地址的地址。

  2. char * 上的 &lt;&lt; 运算符仅适用于 C 风格的字符串。您不能在不是字符串的任意字符数组上使用它。它怎么知道要输出多少个字符?

  3. sizeof 运算符仅告诉您类型的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-11-27
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多