2014-03-18 62 views
0

我收到了总线错误。总线错误。无法访问内存

在调试下面的代码片段,并加强对writeDmpFile结束我越来越:

writeDmpFile (tree=0x56a310, filename=0x7fffffffd450 "20140318.221058") at unzipper_m1.c:146 
146 } 
(gdb) n 
Cannot access memory at address 0x38353031323236 

该文件虽然写的,但程序与总线错误结束。 下面的代码:

typedef struct dmpParams_t 
{ 
    char buff[6000000]; 
    size_t *size; 
}dmpParams_t; 

int writeFile(char *name, unsigned char *buff, size_t *size,const char *dir) 
{ 
    FILE * pFile; 
    chdir (dir); 
    pFile = fopen (name, "wb"); 
    fwrite (buff , sizeof(unsigned char), *size, pFile); 
    fclose (pFile); 

    return 1; 
} 

int writeDmpFile(GTree *tree, char *filename) 
{ 
    char dmpfilename[32]; 

    dmpfilename[0] ='\0'; 
    dmpParams_t params; 
    params.buff[0] ='\0'; 
    size_t size =0; 
    params.size=&size ; 
    g_tree_foreach(tree, (GTraverseFunc)writeDmpFileLine, &params); 
    sprintf (dmpfilename, "InstrumentList_FULL.csv_%.*s", 15, filename); 
    writeFile(dmpfilename, (unsigned char *)params.buff, &size , dmpdir);//(size_t *)params.size, dmpdir); 
} 
+2

这不是“所有的代码”。这些函数如何被调用? “无法访问”的内存位置是_clearly_指向不在大多数内存映射中的位置 - 除非您拥有1600万GB的RAM ... – Floris

+0

是的,但是地址必须在提供的部分中被覆盖。 – MaMu

+3

'char buff [6000000];'大约6MB,这对于很多系统中的堆栈来说太多了。使用'malloc'来分配这个数组......或者使用一个更小的数组。 – ouah

回答

2

它看起来像溢出的dmpfilename的缓冲区。您分配了一个长度为32的数组。然后使用"InstrumentList_FULL.csv_%.*s"对其进行格式化。这是24个字符,另加15个文件名,加上一个空终止符。这比32多。

增加缓冲区的大小。

哦,和dmpParams_t是呃相当大。当你将其中一个分配给本地时,可能会出现堆栈溢出。

一些其他意见:

  1. 你可以有效地使用const多一点。
  2. 在struct中声明sizesize_t*有点奇怪。您将结构的地址传递给g_tree_foreach。我会声明sizesize_t并让g_tree_foreach修改该值。
  3. 同样,您将size的地址传递给writeFile似乎很奇怪。 const常量的价值似乎更有意义。