相关疑难解决方法(0)

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

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

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

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

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

c memcpy null-pointer language-lawyer

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

((struct name*)0) - > member)在C中做什么?

((struct name*)0) - > member)在C中做什么?

我遇到的实际C语句是这样的:

(char *) &((struct name *)0)->member)
Run Code Online (Sandbox Code Playgroud)

c struct pointers

22
推荐指数
3
解决办法
1939
查看次数

是否取消引用一个等于nullptr标准的未定义行为的指针?

一位博客作者提出了有关空指针解除引用的讨论:

我在这里提出一些反驳论点:

他引用标准的主要推理理由是:

当'podhd'是空指针时,'&podhd-> line6'表达式在C语言中是未定义的行为.

C99标准说明了以下关于'&'地址的运算符(6.5.3.2"地址和间接运算符"):

一元&运算符的操作数应该是函数指示符,[]或一元*运算符的结果,或者是一个左值,它指定一个不是位字段的对象,并且不用寄存器存储类说明符声明.

表达式'podhd-> line6'显然不是函数指示符,是[]或*运算符的结果.这是一个左值表达式.但是,当'podhd'指针为NULL时,表达式不指定对象,因为6.3.2.3"Pointers"表示:

如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.

当"左值在评估时未指定对象时,行为未定义"(C99 6.3.2.1"左值,数组和函数指示符"):

左值是具有对象类型或除void之外的不完整类型的表达式; 如果左值在评估时未指定对象,则行为未定义.

所以,同样的想法简要说明:

当在指针上执行 - >时,它会计算到没有对象存在的左值,因此行为是未定义的.

这个问题纯粹是基于语言的,我不会问一个给定的系统是否允许用任何语言篡改地址0的内容.

据我所知,取消引用一个值等于的指针变量没有限制nullptr,甚至认为指针与nullptr(或(void *) 0)常量的比较在某些情况下可能会因为所述段落而在优化中消失,但这看起来像另一个问题是,它不会阻止取消引用其值等于的指针nullptr.请注意,我已经检查了其他SO问题和答案,我特别喜欢这组引用,以及上面的标准引号,我没有偶然发现一些明显从标准中推断出如果指针ptr比较等于nullptr,取消引用这将是未定义的行为.

我得到的最多是将常量(或其转换为任何指针类型)引用的是UB,但没有任何关于变量等于从中得到的值的变量nullptr.

我想清楚地将nullptr常量与保持值等于它的指针变量分开.但解决这两种情况的答案都是理想的.

我确实意识到,当进行比较nullptr等时,优化可以快速进行,并且可以简单地基于此来剥离代码.

如果结论是,如果ptr等于nullptr解除引用的值肯定是UB,另一个问题如下:

C和C++标准是否意味着地址空间中的特殊值必须仅存在才能表示空指针的值?

c c++ language-lawyer

9
推荐指数
2
解决办法
6117
查看次数

C中的OO多态性,混叠问题?

我和一位同事正试图实现一个简单的多态类层次结构.我们正在研究嵌入式系统,仅限于使用C编译器.我们有一个基本的设计思想,在没有警告的情况下编译(-Wall -Wextra -fstrict-aliasing -pedantic),并且在gcc 4.8.1下运行正常.

但是,我们有点担心别名问题,因为我们还不完全理解这会成为问题.

为了演示我们已经编写了一个带有"接口"IHello的玩具示例和两个实现此接口'Cat'和'Dog的类.

#include <stdio.h>

/* -------- IHello -------- */
struct IHello_;
typedef struct IHello_
{
    void (*SayHello)(const struct IHello_* self, const char* greeting);
} IHello;

/* Helper function */
void SayHello(const IHello* self, const char* greeting)
{
    self->SayHello(self, greeting);
}

/* -------- Cat -------- */
typedef struct Cat_
{
    IHello hello;
    const char* name;
    int age;
} Cat;

void Cat_SayHello(const IHello* self, const char* greeting)
{
    const Cat* cat = (const Cat*) self;
    printf("%s I …
Run Code Online (Sandbox Code Playgroud)

c oop polymorphism strict-aliasing

5
推荐指数
1
解决办法
537
查看次数

通过将 NULL 转换为结构指针来确定结构成员的偏移量

考虑以下代码:

#include <inttypes.h>

struct test {
    int a;
    long b;
};

int main(void){
    intptr_t ptr = (intptr_t) &(((struct test *)NULL)->b);
    printf("%"PRIiPTR"\n", ptr); //prints 8
    //...
}
Run Code Online (Sandbox Code Playgroud)

我已经使用这种结构很长一段时间来确定结构成员的偏移量,但现在质疑这种结构是否从标准的角度得到了明确的定义。

我不清楚的是为什么在NULL稍后获取地址的指针上执行间接寻址是合法的?

c struct pointers language-lawyer

0
推荐指数
1
解决办法
71
查看次数