【发布时间】:2021-08-03 02:14:51
【问题描述】:
在这里提供一个问题的答案后,我正在测试我编辑的this code 并注意到一些奇怪的行为:
#include <iostream>
#define MAX 100
using namespace std;
int main()
{
int size = 0;
int array[MAX];
int i, j;
int input;
cout << "Array: ";
for(i = 0; i < MAX; i++)
{
cin >> input;
if(input == -1)
break;
else
{
array[i] = input;
size++;
}
}
cout << "Size: " << size << "\n\n";
int left[size / 2];
int right[size / 2];
for(i = 0; i < size / 2; i++)
left[i] = array[i];
for(i = size / 2, j = 0; i < size; i++, j++)
right[j] = array[i];
cout << "Left: ";
for(i = 0; i < size / 2; i++)
cout << left[i] << ' ';
cout << '\n';
cout << "Right: ";
for(i = 0; i < size - size / 2; i++)
cout << right[i] << ' ';
cout << '\n';
return 0;
}
此代码应该将数组拆分为两个单独的数组。当这些是输入时,输出是错误的:
1 2 3 4 5 6 7 8 9 -1
Left: 9 2 3 4
Right: 5 6 7 8 9
调试后如果left的元素是这样打印的:
for(i = size / 2, j = 0; i < size; i++, j++)
{
right[j] = array[i];
cout << left[0] << ' ';
}
cout << '\n';
表示left[0]的值在第5次迭代后被修改:
1 1 1 1 9
Left: 9 2 3 4
Right: 5 6 7 8 9
这只发生在数组大小为 9 时。我还没有测试超过 16。我可以修复代码,使其具有正确的大小
int right[size - size / 2];
或使用malloc() 来遵守 C++ 标准,
int *left = (int *) malloc(sizeof(*left) * n / 2);
int *right = (int *) malloc(sizeof(*left) * n / 2);
这样left 就不会受到影响,但这不是我要问的。为什么只有在拆分大小为 9 的数组时才会发生这种情况?为什么left[0] 会被覆盖?这是应该报告的 g++ 中的错误还是其他问题?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ arrays g++ variable-length-array