对于一个函数,是否有任何合法的方法来将给定长度的 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/