gpt4 book ai didi

数组指针的常量正确性?

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

有人争论说在现代 C 中,我们应该始终通过数组指针将数组传递给函数,因为数组指针具有强类型。示例:

void func (size_t n, int (*arr)[n]);
...

int array [3];
func(3, &array);

这听起来像是防止各种类型相关和数组越界错误的潜在好主意。但后来我突然想到,我不知道如何对此应用 const 正确性。

如果我执行 void func (size_t n, const int (*arr)[n]) 那么它就是 const 正确的。但是由于指针类型不兼容,我无法再传递数组。 int (*)[3]const int (*)[3]。限定符属于指向的数据而不属于指针本身。

调用者中的显式强制转换会破坏提高类型安全性的整个想法。

如何将 const 正确性应用于作为参数传递的数组指针?有可能吗?


编辑

正如info,有人说像这样通过指针传递数组的想法可能起源于MISRA C++:2008 5-2-12。参见示例 PRQA's high integrity C++ standard .

最佳答案

除了施法没有办法。这是以这种方式传递数组的想法的重大缺点。

Here is一个类似的线程,其中将 C 规则与 C++ 规则进行比较。我们可以从这个比较中得出结论,C 规则设计得不是很好,因为您的用例是有效的,但 C 不允许隐式转换。另一个这样的例子是 T **T const * const * 的转换;这是安全的,但 C 不允许。

请注意,由于 n 不是常量表达式,因此 int n, int (*arr)[n] 相比没有任何附加的类型安全>int n, int *arr.您仍然知道长度 (n),越界访问仍然是无声未定义行为,传递实际长度不是 n 的数组仍然是无声未定义行为。

这种技术在传递非 VLA 数组的情况下更有值(value),如果您传递指向错误长度数组的指针,编译器必须报告。

关于数组指针的常量正确性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36199473/

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