【问题标题】:What does this C Pointer Code Produce? [ulong pointer -> uint]这个 C 指针代码产生什么? [ulong 指针 -> uint]
【发布时间】:2021-10-07 20:10:51
【问题描述】:

嘿,窥视,

我目前正在将一些旧的 C 库移植到 C#,但在理解包含指针的特定代码段时遇到了一些麻烦。
在 C 方面不是最好的,所以我可能缺乏一些理解。

这是我正在查看的简化版本:

unsigned int block[2];

// --- inside a function

unsigned int *block;       // only got access to this pointer not the array
unsigned long left, right;

// some math


*block++ = right;  // these lines are the important bit i dont quite get
*block = left;

现在...

我认为到目前为止我得到的是:

  • 第一行...
    • 取消引用指针
    • 将其值设置为right
    • 将指针向前步进 1
  • 第二行...
    • 取消引用指针
    • 将其值设置为left

现在我难以理解的是最终结果 (blocks[]) 的外观。
(遗憾的是不能只调试它并偷看一下,因为我真的不知道 id 如何使用 lib 二进制文件来做到这一点......)
如果 leftright 也是 uint,但它们都是 ulong,那么可能会发生某种覆盖,对吧?

我对此有点困惑/迷失了...... 也许有一些更好的C知识可以帮助我^^

【问题讨论】:

  • block 是否曾在函数内部初始化过?
  • 嘿@sj95126 可能应该提到过,呵呵,block 在它交给函数之前被初始化。 @Barmar 已经给了我正在寻找的答案,但仍然感谢您的回答! ^^
  • 我的意思是您将unsigned int *block 称为“函数内部”-在这种情况下,block 是函数的参数还是局部变量?只需确保指针具有有效值,或者取消引用它将是可能“发生”工作的未定义行为。但是,如果 Barmar 解决了您的问题,那就太好了!

标签: c pointers uint ulong


【解决方案1】:

这基本上是这样做的:

block[0] = (unsigned int) right;
block[1] = (unsigned int) left;

unsigned long 转换为unsigned int 只会丢弃多余的高位。

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2014-08-07
    相关资源
    最近更新 更多