当我尝试编写可在文件中打印代码的代码时,出现一条错误消息“发生了异常。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;
}
此代码应自行打印代码。
答案 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);
请勿使用100
或1000
之类的幻数,而是建议为此使用宏。
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 */