相关疑难解决方法(0)

指向类数据成员"::*"的指针

我遇到了这个编译好的奇怪的代码片段:

class Car
{
    public:
    int speed;
};

int main()
{
    int Car::*pSpeed = &Car::speed;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么 C++有一个指向类的非静态数据成员的指针?在实际代码中这个奇怪的指针有什么用?

c++ pointers class c++-faq

223
推荐指数
8
解决办法
15万
查看次数

为什么offsetof()的实现有效?

在ANSI C中,offsetof定义如下.

#define offsetof(st, m) \
    ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
Run Code Online (Sandbox Code Playgroud)

为什么这不会引发分段错误,因为我们正在取消引用NULL指针?或者这是某种编译器黑客,它看到只有偏移的地址被取出,所以它静态地计算地址而不实际解除引用它?这个代码也可以移植吗?

c pointers offsetof

32
推荐指数
4
解决办法
2481
查看次数

((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
查看次数

你如何在struct上使用offsetof()?

我想要offsetof()参数行mystruct1.我试过了

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 
Run Code Online (Sandbox Code Playgroud)

并且

offsetof(struct mystruct1, line)  
Run Code Online (Sandbox Code Playgroud)

但都不起作用.

union {
    struct mystruct1 structPtr1;
    struct mystruct2 structPtr2;
} rec;

typedef struct mystruct1 {
    union {
        struct {
            short len;
            char buf[2];
        } line;

        struct {
            short len;
        } logo;

    } u_line;
};
Run Code Online (Sandbox Code Playgroud)

c

7
推荐指数
1
解决办法
5831
查看次数

MACRO的offset理解困难

我一直在寻找很长很长的时间(最后的链接)来解释 offsetof MACRO 的实现:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Run Code Online (Sandbox Code Playgroud)

特别是,取消引用 NULL 以获得结构中成员的偏移量。许多文章通过说 NULL 指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义。

以下是我尝试理解的一些链接:

  1. http://www.viva64.com/en/b/0301/
  2. http://www.embedded.com/design/prototyping-and-development/4024941/Learn-a-new-trick-with-the-offsetof--macro
  3. http://www.geeksforgeeks.org/the-offsetof-macro/
  4. C offsetof 宏是如何工作的?
  5. 取消引用 NULL 指针是否保证会导致 C/C++ 中的程序崩溃?

我正在寻找并试图理解的是对编译器如何解释 MACRO 定义的逐步分解理解,这最终将解释 NULL 指针实际上没有被取消引用。

编辑:尽管其他问题回答了我的疑问,但正如原始帖子中所指出的那样,它们对我来说没有意义。@dasblinkenlight 的回答揭示了我在回答其他问题时遇到的确切问题,即我们实际上没有取消引用指针是怎么回事。

c memory macros pointers offsetof

4
推荐指数
1
解决办法
523
查看次数

通过转换nullptr获取成员变量的偏移量

我期待在宏观offsetof<cstddef>,看到一个可能的实现是通过

#define my_offsetof(type, member) ((void*) &(((type*)nullptr)->member))
Run Code Online (Sandbox Code Playgroud)

我尝试过它确实按预期工作

#include <iostream>

#define my_offsetof(type, member) ((void*) &(((type*)nullptr)->member))

struct S
{
    char x;
    short y;
    int z;
};

int main()
{
    std::cout << my_offsetof(S, x) << '\n';
    std::cout << my_offsetof(S, y) << '\n';
    std::cout << my_offsetof(S, z) << '\n';

    S s;
    std::cout << (void*) &((&s)->x) << '\n'; // no more relative offsets
    std::cout << (void*) &((&s)->y) << '\n'; // no more relative offsets
    std::cout << (void*) &((&s)->z) << '\n'; // …
Run Code Online (Sandbox Code Playgroud)

c++ offsetof

2
推荐指数
1
解决办法
411
查看次数

标签 统计

c ×4

pointers ×4

offsetof ×3

c++ ×2

c++-faq ×1

class ×1

macros ×1

memory ×1

struct ×1