c代码中的分段错误需要帮助

时间:2010-11-18 19:14:07

标签: c malloc segmentation-fault

我将数据保存在缓冲区中,

struct buf *bufPtr = malloc((sizeof(struct buf))*(MAX_FILE_SIZE));

然后我想将缓冲区写入大小为(sizeof(struct buf))*(MAX_FILE_SIZE)的文件 然后下面的代码将允许我打开一个新文件,用缓冲区的内容填充它,关闭文件并释放缓冲区

#define MAX_SIZE_PER_FILE 0x4000000
FILE *fp;
struct buf *bufPtr = malloc((sizeof(struct buf))*(MAX_FILE_SIZE));

k1[0]=0x0000;

k1[1]=0x0000;

while(k1[0] != 0xffff)

{

    while(k1[1] != 0xffff)

    {
                //something different happens in the below line, but has noting to do with segmentation errors
                bufPtr[i].a[1] = k[1]
                //occurs on all variables of the struct

                if( write_count + sizeof(struct buf) >= sizeof(struct buf)*MAX_FILE_SIZE ) {

                     write_count = 0;

                     sprintf( filename, "keys%d", file_idx );

                     file_idx++;

                     fp = fopen(filename, "wb");
                     printf("test1");
                     fwrite(bufPtr, sizeof(struct buf)*(MAX_FILE_SIZE),1,fp);
                     fclose(fp);
                     free(bufPtr);

                  }
                write_count += sizeof(struct buf);
                k1[1]++;

                counter++;

     }
     write_count += sizeof(struct buf);

     k1[1]++;

     i++;

}

我在这段代码中的某一点出现了分段错误,我知道max_file_size会更大,因为struct buf包含两个短路

struct buf{

    unsigned short a[2];

     unsigned short b[2];

};

对我来说任何想法

我通过我的mac

运行此错误
Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
(gdb) 

这是在struct

中的值
bufPtr[counter].a[0] = a1[0];

上面的行发生在其他所有内容之前,但是因为它在另一个循环中,它必须是我正在使用或分配的内存量的问题

6 个答案:

答案 0 :(得分:2)

三件不应该改变的东西,但会使我们(和你)更容易理解和修复你的代码。

  • 永远不要对变量和类型使用相同的名称(buf与buf),最好避免仅在类型上有所不同的标识符。一个常见的习语是大写类型。 (Buf vs buf
  • 很好地格式化和缩进代码
  • 使用typedef struct进行结构定义

以下是一个例子:

typedef struct
{
  unsigned short a[2];
  unsigned short b[2];
} Buffer;

Buffer *buf = malloc(sizeof(Buffer) * MAX_FILE_SIZE);

至于导致段错误的原因,很难说。我希望看到#define的{​​{1}},以及有关崩溃发生位置的更多背景信息。你的MAX_FILE_SIZE现在看起来很好,但是你没有检查它是否成功......

答案 1 :(得分:1)

  • 您永远不会检查fopen(3)的返回值,当它无法打开文件时会返回NULL
  • sizeof( struct buf )告诉您结构的大小,而sizeof( buf )给出buf变量的大小,即指针的大小,取决于平台,为4或8个字节。< / LI>

答案 2 :(得分:1)

请改用sizeof(struct buf)。

答案 3 :(得分:0)

要做的第一件事:在调试器下运行它。什么线导致段错误?

此外,sizeof(buf)总是会在正常的32位计算机上为您提供4,因为您正在使用指针的大小。

答案 4 :(得分:0)

作为一般的经验法则,总是通过适当的错误处理代码(即return(1))错误检查I / O函数和系统调用。尝试在if语句中运行这些类型的函数,并在语句中处理日志记录/调试/退出。

答案 5 :(得分:0)

尝试将fwrite更改为:

fwrite(buf, sizeof(struct buf), MAX_FILE_SIZE, fp);

你分配了struct buf * buf来为MAX_FILE_SIZE分析struct buf数据分配内存。

If声明可能也是一个问题;但是,我需要知道它周围的代码是什么 - 这是在循环中完成的等等。