在C ++中,我告诉程序数组应该有多大(x)后会出现分段错误。
为什么会发生这种情况?如何解决这个问题?
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
int array[x];
for (int *j=array; j; j++)
{
*j=0;
}
for (int *i=array; i; i++)
{
cin >> *i;
}
cout << array[3] << endl;
}
答案 0 :(得分:2)
您的循环条件错误。
for (int *j = array; j; j++)
和
for (int *i=array; i; i++)
不会在数组末尾停止,因为条件j
(i
)在遍历数组时为真(即,为假,指针需要为{{1} })。事实上,pointer arithmetic past the array boundary plus one results in undefined behaviour。你的停止条件应该是
nullptr
此外,可变长度数组是扩展,不受C ++标准的支持。正如@Joshua Byer指出的那样,使用i < array + x;
来分配内存。
答案 1 :(得分:0)
int * array;
array= new int [x];
答案 2 :(得分:0)
在for
语句中,第二个表达式应该通过评估false
来终止循环。在这种情况下,你永远不会终止循环:
for (int *j=array; j; j++)
取而代之的是:
for (int *j=array; j < array + x; j++)
表达式array + x
(通过指针运算)表示超出数组末尾的一个元素。
以上两种循环都适用。
答案 3 :(得分:0)
循环中使用的条件不正确。
例如。 [data][request][json]
即使for (int *j = array; j; j++)
最终会到达数组的末尾,但仍然永远不会评估为false(允许循环完成)。除此之外,它意味着您将迭代到数组末尾并进入未定义行为,这可能是您看到段错误的原因。
您需要执行以下操作(超级大解决方案!!!!也不支持C ++标准):
j
将递增计数器并在增加指针的同时检查数组。
或强> 使用矢量
std::vector是一种更轻松的方式来做你正在做的事情。
for (int i = 0, *j = array; i < x; i++, j++)