[英]Seg Fault when initializing array
我正在上课,并遇到分段错误。 根据我的理解,当您访问尚未分配的内存或超出边界时,应该发生seg错误。 '当然我要做的就是初始化一个数组(虽然相当大)
我只是误解了如何解析二维数组? 错误放置绑定正是导致seg错误的原因 - 我在使用嵌套for-loop
时错了吗?
教授提供了时钟功能,所以我希望这不是问题所在。 我在Cygwin中运行此代码,这可能是问题吗? 源代码如下。 也使用c99标准。
要非常清楚:我正在寻找帮助理解(并最终修复)我的代码产生seg错误的原因。
#include <stdio.h>
#include <time.h>
int main(void){
//first define the array and two doubles to count elapsed seconds.
double rowMajor, colMajor;
rowMajor = colMajor = 0;
int majorArray [1000][1000] = {};
clock_t start, end;
//set it up to perform the test 100 times.
for(int k = 0; k<10; k++)
{
start=clock();
//first we do row major
for(int i = 0; i < 1000; i++)
{
for(int j = 0; j<1000; j++)
{
majorArray[i][j] = 314;
}
}
end=clock();
rowMajor+= (end-start)/(double)CLOCKS_PER_SEC;
//at this point, we've only done rowMajor, so elapsed = rowMajor
start=clock();
//now we do column major
for(int i = 0; i < 1000; i++)
{
for(int j = 0; j<1000; j++)
{
majorArray[j][i] = 314;
}
}
end=clock();
colMajor += (end-start)/(double)CLOCKS_PER_SEC;
}
//now that we've done the calculations 100 times, we can compare the values.
printf("Row major took %f seconds\n", rowMajor);
printf("Column major took %f seconds\n", colMajor);
if(rowMajor<colMajor)
{
printf("Row major is faster\n");
}
else
{
printf("Column major is faster\n");
}
return 0;
}
您的程序在我的计算机上运行正常(x86-64 / Linux),所以我怀疑您在调用堆栈的大小上遇到系统特定的限制。 我不知道你在Cygwin上有多少堆栈,但你的数组是4,000,000字节(32位int
) - 这可能很容易。
尝试将majorArray
的声明移出main
(在#include
之后直接放置) - 然后它将是一个全局变量,它来自一个可以更大的不同分配池。
顺便说一句,这种比较是倒退的:
if(rowMajor>colMajor)
{
printf("Row major is faster\n");
}
else
{
printf("Column major is faster\n");
}
此外,要做这样的测试,你真的应该重复许多不同阵列大小和形状的过程。
我无法在您的代码中找到任何错误,因此我编译并运行它并按预期工作。
但是,您的代码中存在语义错误:
start=clock();
//set it up to perform the test 100 times.
for(int k = 0; k<10; k++)
{
应该:
//set it up to perform the test 100 times.
for(int k = 0; k<10; k++)
{
start=clock();
此外,最后的条件应改为反向:
if(rowMajor<colMajor)
最后,为了避免其他人提到的os特定堆栈大小的问题,你应该在main()之外定义你的矩阵:
#include <stdio.h>
#include <time.h>
int majorArray [1000][1000];
int main(void){
//first define the array and two doubles to count elapsed seconds.
double rowMajor, colMajor;
rowMajor = colMajor = 0;
这个代码在Linux下运行正常,我看不出任何明显错误的东西。 您可以尝试通过gdb进行调试。 像这样编译它:
gcc -g -o testcode test.c
然后说
gdb ./testcode
并在gdb中说run
如果崩溃,说where
和gdb告诉你,崩溃发生的位置。 然后你现在在错误的哪一行。
该程序在由gcc编译时运行良好,并且在Linux中运行,Cygwin可能就是你的问题。
如果它在其他地方正确运行,你很可能试图获得比操作系统允许的更多的堆栈空间。 你在堆栈上分配4MB(1个整数),这对于在堆栈上“安全”分配来说太过分了。 malloc()和free()是你最好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.