【问题标题】:c - converting a pointer to const int into pointer to just int (and modyfing it)c - 将指向 const int 的指针转换为仅指向 int 的指针(并对其进行修改)
【发布时间】:2021-01-16 12:23:53
【问题描述】:

互联网的好人!

在我穿越 C 风雨如磐的土地的新手旅程中,我发现了这段代码:

void * add (void * _set, const void *_element)
{   int * set = _set;
    const int * element =_element;
    assert(set > heap && set < heap +MANY);
    assert(* set ==MANY);
    assert(element >heap && element < heap +MANY);
    if (* element == MANY)
        * (int *) element = set — heap;
    else
        assert(* element == set —heap);
    return (void *)element;
}

在这段代码中,heapints 的数组,MANY 是整数文字的宏,整个想法是将heap 的某个元素的索引存储在element(或检查它是否已经存在)。 _set_element 被假定为指向 heap 元素的指针。

问题是 - 他们为什么可以先说 _element 指向 const 某物,然后创建一个新指针 element 指向 const int,然后将其转换为指向常规的指针int 然后只修改这个int?是不是有什么不好的禁术?

提前谢谢你,好心的先生们!

干杯!

【问题讨论】:

  • 如果您询问您在垃圾箱中发现的严重损坏的 C 代码中的每一个荒谬的东西,您将花费大量时间在人们的智力破产中。
  • @EOF - 我不知道为什么“新蜜蜂之旅”这个词组合没有告诉你我还没有很好地区分“可怕的破 C”和我可能只是不知道的东西知道或理解,但感谢您指出使用上面示例中的代码是一种不好的做法。

标签: c pointers casting


【解决方案1】:

如果一个对象是用const定义的,那么 C 标准没有定义尝试修改它的行为。

但是,如果定义了一个对象没有const,您可以创建一个指向它的指针,将const 添加到该指针,然后删除const。例如,以下具有明确定义的行为:

int x = 3;

// Fine, make a pointer to x:
int *p = &x;

// Copy into a `const int *`.
// Compiler accepts adding `const` without complaint:
const int *cp = p;

// Copy into an `int *` without `const`.
// Requires a cast because the compiler would complain without it:
int *np = (int *) cp;

// Change x, which was not defined with `const`.
*np = 4;

// Prints 4:
printf("%d\n", x);

使用它的场景是提供某些功能的库创建一个对象并希望客户端不要修改它。因此它为对象分配空间并给客户端一个const-qualified 指向它的指针。 (尽管客户端可以修改对象,如上图所示使用强制类型转换移除const,但相信不能这样做——这种技术是为了防止无辜的错误,而不是为了防止蓄意的恶意。)稍后,当库想要修改或解除分配对象时,它可以使用从客户端接收的指针并使用强制转换删除const 限定符。

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多