在 C++ 中分配内存的问题

Problems with allocating memory in c++

本文关键字:问题 内存 分配 C++      更新时间:2023-10-16

很遗憾,我不得不承认我一直在尝试自学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;
}

我看到以下问题。

问题1

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

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

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

问题2

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

memset( buffer, 'a', 8 );

问题3

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

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

您需要确保buffer以空终止。

buffer[7] = '';
std::cout << buffer <<std::endl; // No need for explicit cast
  1. 您复制到buffer的地址。但buffer保存缓冲区的地址。因此,您正在复制到地址的地址中。

  2. char *上的<<运算符仅适用于 C 样式的字符串。不能在不是字符串的任意字符数组上使用它。它如何知道要输出多少个字符?

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

Void 指针非常棘手,通常不使用。 我只会让它成为一个字符*指针,而不使用缓冲区的引用。 指针的名称是整个内存位置的引用。

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

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