[英]C programming: EXC_BAD_ACCESS
我正在用Xcode用C编写这个简单的程序。
#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;
}
我将以下消息附加到printf("%d",B);
Thread 1: EXC_BAD_ACCESS (code=2, address= ….)
所以基本上是说我弄糟了记忆。 那怎么可能呢?
但是,如果我发表评论
// int C[200][200][2][1][2];
它完美地工作。
有什么线索吗? Xcode应该不会有问题,因为在Eclipse中无论如何都不会进行任何打印。
我不太确定为什么您要观察EXC_BAD_ACCESS
。 但是您的代码已损坏。 首先,将B
传递给printf
并要求其将其格式化为整数。 它不是整数。 如果要将%p
视为指针,则应使用%p
。
另一个问题是您的局部变量将在堆栈上分配。 而且它们太大了,它们会溢出堆栈。 最大的是A
,它的sizeof(double)*200*200*2*1*2*2
,即256万字节。 您不能期望在堆栈上分配如此大的数组。 您需要切换为使用动态分配的数组。
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 sizeof(double))运行的双打数组。 您还有3个其他的double
数组,它们的大小是原来的一半; 您有2个大小为1/4的int
数组。 这些总计达7.560 MB(7.4 MiB)。 甚至G,H和I也使用了适量的堆栈空间:总的来说,它们和D一样大,因此它们使用大约1 MiB。
这些大小的总和对于堆栈而言太大。 您可以使它们成为文件作用域数组,也可以使用malloc()
等动态分配它们。
为什么在地球上会有[1]
的维? 您只能将0写为有效下标,但是为什么要麻烦呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.