c++内存分配问题

Problems with allocating memory in c++

很遗憾,我不得不承认我一直在尝试自学 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. 你复制到buffer的地址。但是 buffer 保存缓冲区的地址。所以你是复制到地址的地址。

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

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

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

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

祝你好运。看起来你大部分时间都在使用它。

我看到了以下问题。

问题 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] = '[=14=]';
std::cout << buffer <<std::endl; // No need for explicit cast