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;
}
你复制到buffer
的地址。但是 buffer
保存缓冲区的地址。所以你是复制到地址的地址。
char *
上的 <<
运算符仅适用于 C 风格的字符串。您不能在非字符串的任意字符数组上使用它。它怎么知道要输出多少个字符?
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
很遗憾,我不得不承认我一直在尝试自学 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;
}
你复制到
buffer
的地址。但是buffer
保存缓冲区的地址。所以你是复制到地址的地址。char *
上的<<
运算符仅适用于 C 风格的字符串。您不能在非字符串的任意字符数组上使用它。它怎么知道要输出多少个字符?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