【发布时间】:2019-08-16 21:28:01
【问题描述】:
我可以确定以下代码可以工作吗?
int sum_array(int *array, size_t size)
{
int i;
int sum = 0;
for (i=0;i<size;i++)
sum += *(array+i);
return sum;
}
int main()
{
int two_d_array[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
int sum = sum_array(&two_d_array[0][0], 12);
printf("%d", sum);
}
虽然 4×3 数组在内存中的布局与 12 元素数组完全相同,但是否保证?由于我似乎在欺骗类型系统,我不太确定会出现问题(例如,将填充添加到 int[3])。
如果您能详细说明如果我在数组中使用非整数值会发生什么情况,并提供标准中的相关引用,则可以加分。
【问题讨论】:
-
我正在为此寻找骗子。很确定结论是它在技术上是 UB
-
@NathanOliver 我也看到过回答说它在技术上不是 UB。
-
Franco,如果您实际上并不关心每个标准版本,如果您指定标准的特定版本,可能会更容易回答这个问题。 (在实践中,我发现“编译器不会崩溃,但这是 UB”仅在 最新 标准版本中值得关注,因为现有编译器不会说“我知道,回来在 C++14 中这是 UB,所以让我们围绕我们在 C++17 中禁用的 UB 添加一些优化")
-
似乎this paragraph 表示一旦到达第一个数组的末尾,
i++就是未定义的行为。对于数组数组的情况,我不确定是否有任何矛盾。
标签: c++ c++11 multidimensional-array language-lawyer