我试图在我的Mac上构建其他人的C程序,使用命令行工具构建命令行程序。直截了当的C程序,应该像任何东西一样简单。但是在main()中变量的声明和初始化过程中,我得到了非常奇怪的内存访问错误,所以很早就发现我真的不知道如何弄乱任何东西。这是基本的核心C语言材料,它如何失败真的打败了我。
Ken$ gcc -std=c99 -ggdb srtm2stl.c geometry.c stlwriter.c -o srtm2stl
Ken$ gdb ./srtm2stl
. . .
(gdb) run
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00007fff5b74f6c0
0x0000000100000e37 in main (argc=10, argv=0x7fff5fbff990) at srtm2stl.c:195
195 char SolidName[132] = {' '}; // Optional name for solid (text format STL files)
(gdb) list 195
190 int main(int argc, char *argv[])
191 {
192 FILE *in = NULL; // input file
193 FILE *out = NULL; // output file
194
195 char SolidName[132] = {' '}; // Optional name for solid (text format STL files)
196 // char SolidName[132]; // Optional name for solid (text format STL files)
197 int Verbose = 0; // Flag: Verbose
唯一想到的是它在64位模式下构建,而我之前从未构建过64位程序。是否需要为gcc提供其他命令行参数才能使其正常工作?还是其他理论?
注意第196行。如果我注释掉第195行并使用196,我们会在类似的崩溃前稍微进一步:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00007fff5b74f8e0
main (argc=1, argv=0x7fff5fbffa20) at srtm2stl.c:216
216 unsigned int i = 0;
(gdb) list 216
214 long Bias = 0;
215 short grid[MAXROWS][MAXCOLS]; // Array to hold the elevations
216 unsigned int i = 0;
217 short stemp;
似乎有关于数组的东西。 MAXROWS和MAXCOLS在这个版本中都是6001,不应该用现代内存大小压倒一切。正确?
OSX 10.7.5,gcc版本i686-apple-darwin10-llvm-gcc-4.2, GNU gdb 6.3.50-20050815
答案 0 :(得分:0)
extern short grid; // global outside the main
grid = malloc(sizeof(short) *6000*6000) // inside the main..
似乎你正在使用多个文件..如果你使用任何标题,那么你也可以extern网格并在其他地方使用它..详细信息只能在我们看到实现后给出..此外,如果您正在使用OSX我建议您使用lldb而不是gdb ..因为Mac上的gdb可能有代码签名问题
答案 1 :(得分:0)
WhozCraig得到了它。 (看他的评论。)我试图在堆栈上分配比堆栈可以处理的更多。将阵列移动到全局存储会修复所有问题。