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

时间:2016-03-06 00:40:40

标签: c++ pointers memory allocation

很遗憾,我不得不承认,我一直在努力教自己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;
}

3 个答案:

答案 0 :(得分:3)

我看到以下问题。

问题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

答案 1 :(得分:0)

  1. 您复制到buffer的地址。但buffer保存缓冲区的地址。所以你要复制到地址的地址。

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

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

答案 2 :(得分:-1)

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

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

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