gpt4 book ai didi

c++ - 为什么这个 volatile 指针转换无效

转载 作者:行者123 更新时间:2023-11-28 07:21:04 25 4
gpt4 key购买 nike

为什么下面代码中的赋值编译失败?

struct foo
{
int* m_NormalIntPointer;
int* volatile m_IntPointerModifiedByManyThreads;


void func()
{
//compiles fine
void* pointerToNormalPointer = &m_NormalIntPointer;

//does not compile
void* volatile* pointerToPointerModifiedByManyThreads = &m_IntPointerModifiedByManyThreads;
}
};

如果 m_IntPointerModifiedByManyThreads 是一个指向 int 的指针,并且该指针可以被其他线程修改,而“void* volatile*”是一个指向可以被其他线程修改的指针,为什么赋值需要强制转换,其中非 volatile 版本没有?

最佳答案

这一行:

void* volatile* pointerToPointerModifiedByManyThreads = &m_IntPointerModifiedByManyThreads

它是指向 (void *) 的指针。让我们忽略它易变的事实,因为它无关紧要。 (让我们也忽略一个事实,即当您应该使用原子时,您正在使用 volatile:volatile 对于多线程编程来说几乎没有用。)

您不能将指向 (void *) 的指针转换为指向 (int *) 的指针,反之亦然。就像你不能在指向 struct x 的指针和指向 struct y 的指针之间进行转换,你也不能在指向 (int * ) 和指向 struct x 的指针。这些转换均不允许。

struct x my_x;
struct y *my_yptr = &my_x; // not allowed

int *my_intptr;
void **my_voidptr = &my_intptr; // not allowed, for exact same reason

唯一允许的转换是在指向 void 的指针和其他指针之间。

int my_int;
void *my_voidptr = &my_int; // allowed
int *my_intptr = my_voidptr; // allowed

所以如果你想做转换,你必须转换成void *,而不是void **。由于 int ** 是一个指针,您可以将其转换为 void * 并返回。

下面的代码是正确的,但是很丑陋:

int x = 3, y = 4;
int *my_intptr = &x;
void *my_intptr_ptr = &my_intptr;
*(int **) my_intptr_ptr = &y;
**(int **) my_intptr_ptr = 7;
// now y = 7, and my_intptr = &y

关于c++ - 为什么这个 volatile 指针转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com