初始化数组时初始化错误

我正在上C课,并遇到分段错误。 根据我的理解,当您访问尚未分配的内存或超出边界时,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 secondsn", rowMajor);
   printf("Column major took %f secondsn", colMajor);
   if(rowMajor<colMajor)
   {
     printf("Row major is fastern");
   }
   else
   {
      printf("Column major is fastern");
   }

   return 0;

}

你的程序在我的电脑(x86-64 / Linux)上正常工作,所以我怀疑你的系统特定的调用栈大小限制。 我不知道你在Cygwin上得到多少堆栈,但是你的数组是400万字节(32位int ) - 这可能太大了。

尝试将majorArray的声明移出main (将其放在#include的后面) - 那么它将是一个全局变量,它来自一个可能更大的不同分配池。

顺便说一下,这个比较是倒退的:

if(rowMajor>colMajor)
{
  printf("Row major is fastern");
}
else
{
   printf("Column major is fastern");
}

此外,要做这样的测试,你真的应该重复许多不同的阵列大小和形状的过程。


您试图在堆栈上抓取1000 * 1000 * sizeof( int )个字节。 这不仅仅是你的操作系统允许堆栈增长。 如果在任何Unix上 - 请检查ulimit -a以获取进程的最大堆栈大小。

作为一个经验法则 - 使用malloc(3)在堆上分配大型结构。 或者使用静态数组 - 超出任何函数的范围。

在这种情况下,你可以用下面的majorArray替换majorArray的声明:

int (*majorArray)[1000] = calloc(1000, sizeof majorArray);

我无法在代码中发现任何错误,因此我编译并运行它并按预期工作。

但是,您的代码中存在语义错误:

   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;
链接地址: http://www.djcxy.com/p/43879.html

上一篇: Seg Fault when initializing array

下一篇: How undefined is undefined behavior?