相关疑难解决方法(0)

保证执行memcpy(0,0,0)是否安全?

我不太熟悉C标准,所以请耐心等待.

我想知道,按标准保证memcpy(0,0,0)是否安全.

我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......

但我们可以认为这里的内存区域重叠吗?

c memcpy null-pointer language-lawyer

72
推荐指数
2
解决办法
2万
查看次数

证明"int*p = malloc(1); p [0]"是未定义的行为

我试图说服(引用C99标准的具体部分)一位同事,以下是未定义的行为:

int *p = malloc(1);
p[0] = 0;
Run Code Online (Sandbox Code Playgroud)

但我无法在标准中找到明确确保未定义的具体部分.我正在寻找标准中从这些线到结论的逻辑步骤:未定义的行为.它是从第一行转换void *int *第一行吗?第二行的作业?

我能找到的唯一相关部分malloc是它返回一个适当对齐的指针(7.20.3):

如果分配成功,则返回指针,以便将其分配给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(...)

我试着在标准中寻找空间,但是由于空白和其他词汇问题,噪音太大了.

c malloc language-lawyer

15
推荐指数
4
解决办法
1711
查看次数

我可以使用memcpy写入多个相邻的标准布局子对象吗?

免责声明:这是试图深入研究一个更大的问题,所以请不要挂断该示例在实践中是否有任何意义.

并且,是的,如果要复制对象,请使用/提供复制构造函数.(但请注意,即使该示例也不会复制整个对象;它会尝试在几个相邻(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)

c++ memcpy language-lawyer

6
推荐指数
1
解决办法
423
查看次数

标签 统计

language-lawyer ×3

c ×2

memcpy ×2

c++ ×1

malloc ×1

null-pointer ×1