将fscanf与动态分配的缓冲区配合使用

ryy*_*yst 1 c malloc scanf dynamic

我得到以下代码:

char buffer[2047];
int charsRead;

do {
    if(fscanf(file, "%2047[^\n]%n%*c", buffer, &charsRead) == 1) {
        // Do something
    }
} while (charsRead == 2047);
Run Code Online (Sandbox Code Playgroud)

我想将此代码转换为使用动态分配的变量,以便在调用此代码时,我不会遇到大量内存泄漏.因此,我试过这个:

char *buffer = malloc(sizeof(char) * 2047);
int *charsRead = malloc(sizeof(int));

do {
    if(fscanf(file, "%2047[^\n]%n%*c", *buffer, charsRead) == 1) {
        // Do something
    }
} while (*charsRead == 2047);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.我总是得到"EXC_BAD_ACCESS"错误,就在使用fscanf调用的if语句之前.我究竟做错了什么?

谢谢你的帮助!

- Ry

小智 5

原始代码泄漏的可能性远远小于新代码,因为编译器正在为您管理内存,但如果您觉得必须,请更改为:

if(fscanf(file, "%2047[^\n]%n%*c", buffer, charsRead) == 1) {
Run Code Online (Sandbox Code Playgroud)

你不想在这里取消引用缓冲区,比你在第一段代码中所做的更多.这样做会给你缓冲区中的第一个字符,但你想要缓冲区的地址.

  • @rryst你似乎对内存管理和堆栈如何工作感到非常困惑.你可能想稍微阅读一下. (2认同)