gpt4 book ai didi

c - 初始化数组时出现段错误

转载 作者:太空狗 更新时间:2023-10-29 16:58:46 25 4
gpt4 key购买 nike

我正在上 C 课,遇到了一个段错误。据我了解,当您访问尚未分配的内存或超出范围的内存时,应该会发生段错误。 '当然,我要做的就是初始化一个数组(尽管那个数组相当大)

我只是误解了如何解析二维数组吗?放错界限正是导致段错误的原因——我为此使用嵌套的 for-loop 是不是错了?

教授提供了时钟功能,所以我希望这不是问题所在。我在 Cygwin 中运行这段代码,这可能是问题所在吗?源代码如下。也使用 c99 标准。

非常清楚:我正在寻求帮助来理解(并最终修复)我的代码产生段错误的原因。

#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");
}

此外,要进行这样的测试,您确实应该针对许多不同的阵列大小和形状重复该过程。

关于c - 初始化数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com