c - 将 char * 重新解释为用于只读操作的另一种原始类型的数组的任何合法方法?

标签 c performance language-lawyer

对于一个函数,是否有任何合法的方法来将给定长度的 char * 参数解释为不同整数类型的指针,然后访问该转换后的指针?似乎有很多非法 (UB) 方法来做到这一点...

例如给定以下函数原型(prototype):

int32_t sum_32(char *a, int len);

我想知道是否有一种方法可以合法地编写功能上等同于以下代码的内容:

int32_t sum_32(char *a, int len) {
    assert(len % 4 == 0);
    int32_t total = 0;
    for (int i = 0; i < len / 4; i++) {
        total += ((int32_t *)a)[i]; 
    }
    return total;
}

当然,一种方法是将访问权限分解为字符大小的访问权限,然后重新组合成一个更大的值(对字节序有一些假设,这里假设 LE):

int32_t sum_32(char *a, int len) {
    assert(len % 4 == 0);
    int32_t total = 0;
    for (int i = 0; i < len; i += 4) {
        int32_t val = (int32_t)
                      (a[i+0] <<  0) +
                      (a[i+1] <<  8) +
                      (a[i+2] << 16) +
                      (a[i+3] << 24) ;
        total += val; 
    }
    return total;
}

...但在这里我正在寻找一次访问底层数组一个 int32_t 的解决方案。

如果答案是“不可能”,如果我知道 char *a 的来源是一个分配函数,答案是否会改变——或者,更广泛地说,我是否有任何额外的限制可以放置 a 以便将其作为更大的类型访问是合法的吗?

最佳答案

如果内存最后写为 int32_t 或任何兼容类型,则有效类型变为 int32_t,您可以通过简单的转换来读取它。否则,不违反别名规则是不可能的。

关于c - 将 char * 重新解释为用于只读操作的另一种原始类型的数组的任何合法方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41336062/

相关文章:

c - 为什么 scanf() 在填充数组时不生成内存破坏错误。

performance - 可以使用SIMD或其他方法加快Delphi 6位图修改代码的速度吗?

Javascript 数组迭代 - 内存问题

c++ - 'goto *foo' 其中 foo 不是指针。这是什么?

c - 为什么要限制与套接字交互的 C 标准 I/O 流?

c - 将结构写入管道的正确方法是什么

database - 您如何衡量流经您的软件的所有查询?

c++ - 编译器检查未实例化的模板代码是什么?

c - "void"是标量类型吗?

c - 给定一个 C 语言的字符串,我如何知道它是用 ASCII 还是 Unicode 编码的?