c - 空指针的奇怪行为

标签 c pointers void

我想创建一个获取空指针的函数。该指针指向任意用户数据。现在这不相关。其中更重要的是一个描述符,它描述了这个用户数据。它是在此数据下。我想得到它的地址,有两种不同的解决方案:

struct data_desc {
     size_t size;
     data_type_t type;
     /* And so on... */
};

/* Operate on the descriptor */
void operate_on_data(void *ptr)
{
    struct data_desc *desc;
    /* Now I want to get the desc /*

    /* This is the first approach, simply fails */
    desc = ((struct data_desc *)ptr) - sizeof(struct data_desc);
    /* This is the second, it works...*/
    desc = (struct data_desc *)ptr;
    desc--; 
    /* Do something with desc */
}

如您所见,我使用两种不同的方法获取描述符的地址。我认为第一个更自然,但它行不通。我使用了更多的括号来避免优先级问题。

我知道这些方法不安全第一个不起作用,为什么?这种行为背后的原因是什么?

提前致谢!

最佳答案

问题是指针运算。当你拿一个指针减去 1 时,你实际上是在减去 (1*sizeof(struct))。第一个带有“-sizeof”的等式,你实际上是从指针中减去 (sizeof(struct) * sizeof(struct)) 字节。有道理吗?

关于c - 空指针的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273836/

相关文章:

c - 如何在结构中将 char + int 存储为相同类型和相同成员?

python & c-c++ 单元程序导致段

c - 带有 icd 指针的 C 代码中的 Valgrind 错误

c++ - 当浅拷贝指针时,默认的赋值运算符是否会造成内存泄漏?

c - 如何读取c中的声明

c - 传递参数如 *mode1 和 **mode2 之间的区别

c - 凸包中最大的三角形

c++ - 取消 pthread_cond_wait() 挂起与 PRIO_INHERIT 互斥锁

c# - 从 C# 调用带有 void* 的 dll

c++ - 指向空指针