我有关于打印的问题。 “ EXC_BAD_ACCESS”

时间:2019-07-28 07:23:34

标签: c debugging

当我尝试编写可在文件中打印代码的代码时,出现一条错误消息“发生了异常。EXC_BAD_ACCESS(代码= 1,地址= 0x68)”。

我已经用谷歌搜索了,但没有找到解决方法。

我需要别人的帮助。

谢谢

我认为这是因为内存分配,所以我尝试使用malloc和普通数组。但是,它们都不起作用。

这是代码。

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* fp;
    fp = fopen("pO5.c", "rb");
    // char buf[100];
    char* buf;
    while (1) {
        buf = (char*)malloc(sizeof(buf) * 1000);
        int n = fread(buf, 1, 100, fp);
        if (n == 0) {
            break;
        }
        fwrite(buf, 1, n, stdout);
    }
    fclose(fp);
    return 0;
}

此代码应自行打印代码。

1 个答案:

答案 0 :(得分:3)

这里很少观察到。首先,在这里

fp = fopen("pO5.c", "rb");

应该始终检查fopen()的返回类型,以了解对fopen()的调用是否成功失败。如果fopen()失败并且您在fp上进行进一步操作,可能会导致问题。需要正确的错误处理,例如

fp = fopen("pO5.c", "rb");
if(fp == NULL) {
   fprintf(stderr, "Can't open %s: %s\n", "pO5.c", strerror(errno)); /* include header for errno */
   exit(EXIT_FAILURE);
}

第二,这里

buf = (char*)malloc(sizeof(buf) * 1000);
int n = fread(buf, 1, 100, fp);

请勿使用1001000之类的幻数,而是建议为此使用宏。

sizeof(buf)也是指针的大小,但是您希望它是sizeof(*buf)。 这里not required的类型转换malloc()的结果。对于例如

buf = malloc(sizeof(*buf) * BUF_MAX_SIZE); /* define BUF_MAX_SIZE */

还要检查malloc()的返回值,例如

buf = malloc(sizeof(*buf) * BUF_MAX_SIZE); /* define BUF_MAX_SIZE */
if(buf == NULL) {
  /* @TODO error handling if malloc failed */
}

下面的代码块有缺陷

while (1) {
      buf = (char*)malloc(sizeof(buf) * 1000); 
      int n = fread(buf, 1, 100, fp);
      if (n == 0) {
          break;
      }
      fwrite(buf, 1, n, stdout);
}

主要由于一个原因

  • 您不是要释放每个分配的内存吗?每次buf重新分配新的动态地址且没有对象或指针时,它的内存泄漏 指向先前分配的内存

上述问题的一种解决方案可以是

buf = malloc(sizeof(*buf) * BUF_MAX_SIZE); /* calling malloc() n times costs more, it can be avoided by allocating memory before while(1) block */
if(buf == NULL) {
   /* @TODO error handling of malloc */
}

int n = 0; /* declare here */
while (1) {     
   n = fread(buf, 1, BUF_MAX_SIZE, fp); /* reading BUF_MAX_SIZE bytes every time from file & storing into buf */
   if (n == 0) {
       break;
   }
   fwrite(buf, 1, n, stdout);/* put buf to stdout */ 
   /* zero'd the BUF_MAX_SIZE bytes of buf, can use memset() here */
 }       
 free(buf); /* free here */