我不太熟悉C标准,所以请耐心等待.
我想知道,按标准保证memcpy(0,0,0)
是否安全.
我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......
但我们可以认为这里的内存区域重叠吗?
我试图说服(引用C99标准的具体部分)一位同事,以下是未定义的行为:
int *p = malloc(1);
p[0] = 0;
Run Code Online (Sandbox Code Playgroud)
但我无法在标准中找到明确确保未定义的具体部分.我正在寻找标准中从这些线到结论的逻辑步骤:未定义的行为.它是从第一行转换void *
到int *
第一行吗?第二行的作业?
我能找到的唯一相关部分malloc
是它返回一个适当对齐的指针(7.20.3):
如果分配成功,则返回指针,以便将其分配给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(...)
我试着在标准中寻找空间,但是由于空白和其他词汇问题,噪音太大了.
免责声明:这是试图深入研究一个更大的问题,所以请不要挂断该示例在实践中是否有任何意义.
并且,是的,如果要复制对象,请使用/提供复制构造函数.(但请注意,即使该示例也不会复制整个对象;它会尝试在几个相邻(Q.2)整数上显示一些内存.)
给定C++ 标准布局 struct
,我可以使用一次memcpy
写入多个(相邻)子对象吗?
完整示例:(https://ideone.com/1lP2Gd https://ideone.com/YXspBk)
#include <vector>
#include <iostream>
#include <assert.h>
#include <inttypes.h>
#include <stddef.h>
#include <memory.h>
struct MyStandardLayout {
char mem_a;
int16_t num_1;
int32_t num_2;
int64_t num_3;
char mem_z;
MyStandardLayout()
: mem_a('a')
, num_1(1 + (1 << 14))
, num_2(1 + (1 << 30))
, num_3(1LL + (1LL << 62))
, mem_z('z')
{ }
void print() const {
std::cout <<
"MySL Obj: " <<
mem_a << " / " …
Run Code Online (Sandbox Code Playgroud)