C编程:EXC_坏访问

C编程:EXC_坏访问,c,exc-bad-access,C,Exc Bad Access,我正在用C编写这个简单的程序,使用xcode #include <stdio.h> int main() { double A[200][200][2][1][2][2]; int B[200][200][2][1][2]; int C[200][200][2][1][2]; double D[200][200][2][1][2]; double E[200][200][2][1][2]; double F[200][200][2]

我正在用C编写这个简单的程序,使用xcode

#include <stdio.h>
int main()
{
    double A[200][200][2][1][2][2];
    int  B[200][200][2][1][2];
    int  C[200][200][2][1][2];
    double D[200][200][2][1][2];
    double E[200][200][2][1][2];
    double F[200][200][2][1][2];

    double G[200][200];
    double H[200][200][2];
    double I[200][200];
    double L[50];



    printf("%d",B);

    return 0;
}
所以基本上是告诉我我把记忆搞砸了。这怎么可能呢

但是,如果我评论的话

// int  C[200][200][2][1][2];
它工作得很好


有线索吗?Xcode应该没有问题,因为Eclipse在任何情况下都不会打印任何东西。

我不太清楚您为什么会观察到
EXC\u BAD\u ACCESS
。但是你的代码已经被破坏了。首先,将
B
传递给
printf
,并要求它将其格式化为整数。它不是一个整数。如果要将其视为指针,则应使用
%p


另一个问题是局部变量将在堆栈上分配。它们是如此之大,以至于它们会溢出堆栈。最大的是
A
,即
sizeof(double)*200*200*2*1*2*2
,即2560000字节。您不能期望在堆栈上分配如此大的数组。您需要切换到使用动态分配的阵列。

Mac OS X上的默认堆栈大小为8 MiB(8192 KiB)-请在终端中尝试
ulimit-s
ulimit-a

您有一个以大约2.5 MiB(200 x 200 x 2 x 1 x 2 x 2 x 2 x sizeof(double))运行的double数组。您还有另外3个
double
数组,其大小为该数组的一半;您有两个大小为1/4的
int
数组。这些加起来有7.560MB(7.4MIB)。甚至G、H和I都使用了适度的堆栈空间:总体上,它们与D一样大,所以它们使用大约1个MiB

这些大小的总和对于堆栈来说太大了。您可以使它们成为文件范围数组,也可以使用
malloc()
等动态分配它们


你究竟为什么会有一个
[1]
的维度?您只能将0作为有效的下标写入,但为什么要麻烦呢?

stackoverflow………您是否认真考虑过这一点,并想看看stackoverflow是否有效……感谢大家的评论。你实际上很好地解决了这个问题。这是一个堆栈溢出问题(不知道堆栈有限制)。我动态地分配了所有的东西,它工作得很好。这是一个巨大的动态规划问题的基本版本。维度1来自我在上面键入def的维度(您在这里看到的数字都是原始问题中的typedef),但为了便于说明,我想简化示例。%d是因为我正在打印B[0][0][0][0](结果类似)。我知道我应该把它拿走,但我知道这与最终的EXC_BAD_访问无关。所以我不在乎。在任何情况下,堆栈溢出都是完全正确的。谢谢!
// int  C[200][200][2][1][2];