2017-06-20 130 views
-4

我是一个绝对的初学者,我有一个混乱,我无法指出。这里有两个C程序array [10] vs arrray [n]和分割错误

程序1.

for sum of array of big integers

方案2.

program for same

两个程序是除了在2 [n]的相同代替一个用于在[1]中,两者在devC++编译器中都没有显示任何错误,但为什么在程序1正确时显示“段错误”的hackerrank第二个程序中有[n]

什么是“分割错误”以及它在第二个程序中出现的原因以及为什么devC++不显示此错误?

+1

你看过[问]吗?读一本C的书! – Stargateur

+2

请发布您的代码,而不是期望用户点击图片。还要在编译器上打开更高级别的警告。 –

+3

在第二版中'a [n]':此时n'的值尚未确定。 – BLUEPIXY

回答

1

在第二种情况下,n的值未被初始化。它必须有一些随机值。所以你试图制作一个随机值的可变长度数组。段故障的原因 在这种情况下:

  • 制作一个可变长度数组是未初始化的大小

现在,当我说的n随机值想象。它可能是负面的,非常大的...等等。因此,创建一个未初始化大小的可变长度数组是一种不好的做法,因此会导致分段错误。


什么是分割的错吗?

分段错误意味着您的程序尝试访问不允许的内存区域。这个topis上的好文章是this。仔细阅读并将您的问题与所提到的第四个原因联系起来。

-1

分段错误意味着数组超出界限。换句话说,该程序正试图操作或访问未为该变量保留的数据区域。当引用声明数组之外的地址时,它与Java ArrayIndexOutOfBoundsException相同。

在程序2中,a[n]没有为程序稍后尝试存储的变量声明空间,因此存在分段错误。

+0

“细分错误意味着数组超出界限。“,我是否在[this](http://rextester.com/MHZYI13232)例子中出了界限?段错误是由试图读取或写入非法内存位置的程序引起的。 – Stargateur

+0

尝试访问数组越界会导致未定义的行为,这可能意味着段错误,或者可能意味着程序似乎正常工作,或者可能意味着其他任何事情。 –

+1

@Stargateur读取或写入或执行! (正如你的例子所表明的那样)。因为该进程可能具有对页面的读取权限但不能执行权限。 –

0

在尝试访问内存位置时出现通常的分段错误,您不应该这样做。

program 2数组声明为a[n]其中n是一个变量,并且使用未初始化。变量n仅在声明后使用,未初始化。这里程序无法确定它应该分配给阵列的内存量。您在初次使用后初始化na[n]

因此,当您尝试访问数组元素(以查找总和)时,程序尝试访问它不应该访问的内存位置。这就是发生分段错误的地方。

要解决该问题,请使用数值初始化n或使用值替换n中的。

+0

在第一个例子中初始化数组没有用处,最好的方法是测试'scanf()'的返回值。另外在第二个例子中,OP显然希望使用VLA,并要求用户输入多少个整数。你的解决方案打破了这种行为,最好的方法是在用户输入“n”的值时再次验证'scanf()'返回值,并在正确初始化之后移动数组的声明。 – Stargateur

+0

是的,这是一个错误..我编辑了答案 – surjit