Mac C程序在字符串初始化程序上崩溃

时间:2015-07-03 04:39:48

标签: c macos command-line 64-bit

我试图在我的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

2 个答案:

答案 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得到了它。 (看他的评论。)我试图在堆栈上分配比堆栈可以处理的更多。将阵列移动到全局存储会修复所有问题。