【问题标题】:help needed with segmentation error in c codec代码中的分段错误需要帮助
【发布时间】:2010-11-18 19:14:06
【问题描述】:

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

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) 

这是在结构中的一个值

bufPtr[counter].a[0] = a1[0];

上面的行,出现在其他所有内容之前,但由于它在另一个循环中,它一定是我正在使用或分配的内存量有问题

【问题讨论】:

  • 你是如何定义文件名的?
  • 它实际上写入了一个文件,但是当我在它前面放一个 printf 时,printf 没有被调用,这是我见过的最奇怪的事情
  • @molleman - 有时即使调用 printf() 输出也不会显示,因为输出已缓冲。仅仅因为没有显示文本并不意味着段错误发生在该行之前。
  • 是的,我得到了那个 ghillis,干杯
  • 永远不要调用与 struct 相同的变量。这只是自找麻烦。当你在做sizeof(struct buf)sizeof(buf) 时,你会发现你陷入了自己的陷阱。整理你的代码对你最有帮助。

标签: c malloc segmentation-fault


【解决方案1】:

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

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

这是一个例子:

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

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

至于是什么导致了段错误,很难说。我想查看MAX_FILE_SIZE#define,以及有关崩溃发生位置的更多上下文。你的malloc 现在看起来很好,但你没有检查它是否成功......

【讨论】:

    【解决方案2】:
    • 您永远不会检查fopen(3) 的返回值,它在无法打开文件时返回NULL
    • sizeof( struct buf ) 告诉你结构的大小,而sizeof( buf ) 给你buf 变量的大小,即指针的大小,取决于平台,它是 4 或 8 个字节。

    【讨论】:

      【解决方案3】:

      改用 sizeof(struct buf)。

      【讨论】:

        【解决方案4】:

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

        另外,sizeof(buf) 在普通的 32 位机器上总是给你 4,因为你使用的是指针的大小。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            尝试将 fwrite 更改为:

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

            您分配了 struct buf *buf 来为 MAX_FILE_SIZE 个 struct buf 数据分配内存。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多