gpt4 book ai didi

C 中的强制转换和赋值

转载 作者:行者123 更新时间:2023-11-30 21:47:13 26 4
gpt4 key购买 nike

我怎样才能实现以下目标?取消引用指针并为其赋值,并在一行中将指针增加 (uint64_t) 个字节。

// random address 0xDEADBEEF
unsigned int *myvalue = 0xDEADBEEF;
*((uint64_t*) myvalue)++ = 34;

如果我删除类型转换,则由于类型转换而产生错误,然后它“起作用”,但不会得到我想要的结果。

unsigned int *myvalue = 0xDEADBEEF;
*(myvalue)++ = 34;

我对以下声明的期望:

// myvalue points to 0xDEADBEEF
*((uint64_t*) myvalue)++ = 34;
//myvalue points to 0xDEADBEEF + (64/8)
// at 0xDEADBEEF (a random address) should contain 34

最佳答案

[How can I] De-reference and assign a value to a pointer and increment the pointer by (uint64_t) bytes in one line[?]

您试图用一个表达式做太多事情。你应该把它打破。而且,“一行”或多或少是任意的。我可以将你的单行代码分散到 12 行非空行中,并且我可以将多行代码连接在一起。最接近实际有意义的事情是一个完整的表达式。

尽管如此,如果您坚持在一个完整表达式中执行此操作,并且您愿意假设 int 的大小均分 uint64_t 的大小,那么你可以这样做:

unsigned int *myvalue = 0xDEADBEEF;
*myvalue = 34, myvalue += (sizeof(uint64_t) / sizeof(int));

当然,这主要是围绕“完整表达式”含义的诡辩——使用分号而不是逗号运算符会更好,但这样就会有两个完整表达式。但这就是你选择搭帐篷的地方。

或者,如果您愿意更改 myvalue 的类型,那么这样做会更干净一点:

uint64_t *myvalue = 0xDEADBEEF;
* (int *) (myvalue++) = 34;

然而,总的来说,尽管 C 允许从一种对象指针类型转换为另一种对象指针类型,但它对如何安全使用转换后的结果几乎没有做出任何 promise 。此外,此类转换违反了严格的别名规则,这可能会导致优化编译器生成不正确且难以调试的程序。

关于C 中的强制转换和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38082586/

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