gpt4 book ai didi

c - 一般通过指向字符数组的指针访问数组项?

转载 作者:太空狗 更新时间:2023-10-29 16:56:46 25 4
gpt4 key购买 nike

如果我正在编写通用算法,是否允许我将未知类型的数组别名化为指向数组的指针,其中每个元素都是提供的大小而不调用未定义的行为?

比如下面代码中有没有UB?

typedef void (*action_t)(const void *item);
void do(void *array, size_t eltCount, size_t eltSize, action_t action)
{

// Convenient typedef.
typedef char element[eltSize];
element *elts = array;
element *end = elts + eltCount;

for (; elts != end; elts++) {
action(elts);
}
}

我知道我可以做到:

char *elts = array;
char *end = elts + eltCount * eltSize;

for (; elts != end; elts += eltSize) {
action(elts);
}

但是第一段代码对我来说似乎更加地道,因为编译器为我做了指针运算。上面的函数使用 gcc 和 clang 编译时没有警告(相关的编译标志是 -std=c99 -O3 -fstrict-aliasing -pedantic-errors -Wextra -Wall)。我也想知道严格的别名,但据我所知,似乎我没有在这里打破它,因为允许通过 char* 间接使用对象。

最佳答案

在 C 中,typedef 不引入新类型。它只是命名一个构造。名称及其定义可以互换。 (对于 struct 来说,情况并非如此,除了名称之外,无法表达结构的定义。)

因此,只要您只是在谈论某种形式的 char * —— 如您所知,它是特殊的,因为任何数据指针都可以转换为它 —— 那么您就是依赖定义的行为。

关于c - 一般通过指向字符数组的指针访问数组项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44739121/

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