在 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
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
-
您复制到
buffer
的地址。但buffer
保存缓冲区的地址。因此,您正在复制到地址的地址中。 -
char *
上的<<
运算符仅适用于 C 样式的字符串。不能在不是字符串的任意字符数组上使用它。它如何知道要输出多少个字符? -
sizeof
运算符仅告诉您类型的大小。
Void 指针非常棘手,通常不使用。 我只会让它成为一个字符*指针,而不使用缓冲区的引用。 指针的名称是整个内存位置的引用。
以下是 memset 函数的一个很好的参考: http://www.cplusplus.com/reference/cstring/memset/
祝你好运。 看起来你大部分时间都在工作。
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 包含矢量指针的结构的内存释放问题
- 在函数中分配内存时出现问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 释放内存(主题模板)时出现问题
- C++ 中 std::vector 的内存问题
- C++ DLL 堆内存分配问题
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- delete[]有问题,如何部分删除内存
- 内存泄漏问题
- 指向动态内存中结构中的变量时出现问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- JNA 参数问题:内存访问无效
- boost的问题::内存映射~500MB,外部USB文件