gpt4 book ai didi

c - 在 C99 中指向数组开始之前的元素

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:12 24 4
gpt4 key购买 nike

我有一个整数数组:

int* counters = (int *) calloc(N, sizeof(int));

必须使用基于一个的索引进行索引,例如第一个元素的索引为 1,第二个元素的索引为 2,等等。由于性能非常重要,我决定使用一个技巧:

int* oneIndexedCounters = counters - 1;

这允许我使用基于 1 的索引而无需从索引中减去 1:

// A[i] - contains one based indexes
for (int i = 0; i < K; i++) {
oneIndexedCounters[A[i]] += B[i]; // many times in code
// some other operations on oneIndexedCounters
}

代替:

for (int i = 0; i < K; i++) {
counters[A[i]-1] += B[i];
// ...
}

counters 数组由我的函数返回,所以我无法在数组开头分配虚拟元素。

当您不取消对该指针的引用时,指向数组之前的一个元素是否有效(例如,当数组位于内存页面边界上时)?或者是否有其他不那么棘手且性能良好的解决方案?

最佳答案

Is pointing one element before array valid (for example when array is on memory page boundary) when you are not dereferencing that pointer?

不,它无效。

int* oneIndexedCounters = counters - 1;

counters - 1 未指向有效对象,该操作调用未定义的行为。

(C99, 6.5.6p8) "If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined."

关于c - 在 C99 中指向数组开始之前的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329440/

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