当我运行以下程序时,我不明白为什么
buf.data
,为空。起初我认为这可能是我对内存的误解,所以我试图对缓冲区数组进行malloc,但它没有改变,程序输出。
#include <stdio.h>
typedef void Write(void *, char);
struct Writer {
void *impl;
Write *write;
};
void fprint(struct Writer *w, const char *s) {
while (*s)
w->write(w->impl, *s++);
}
struct StandardOut {};
void StandardOut_write(struct StandardOut *w, char c) { fputc(c, stdout); }
struct Buffer {
char *data;
size_t size;
};
void Buffer_write(struct Buffer *b, char c) {
if (b->size > 0) {
*b->data++ = c;
b->size--;
}
}
int main() {
struct Writer stdoutw = (struct Writer){
.impl = &(struct StandardOut){},
.write = (Write *)StandardOut_write,
};
fprint(&stdoutw, "console meat\n");
char data[1024];
struct Writer bufw = (struct Writer){
.impl = &(struct Buffer){.data = data, .size = sizeof(data)},
.write = (Write *)Buffer_write,
};
fprint(&bufw, "buffered beefalo\n");
struct Buffer buf = *(struct Buffer *)bufw.impl;
fprint(&stdoutw, buf.data);
fprint(&stdoutw, data[0] ? data : "buffer is empty");
}
这是程序的输出:
⯠zig cc interfaces.c
⯠./a.out
console meat
buffered beefalo
因此,它不会在缓冲区中打印消息。此外,数组不是空的
mains
观点
。因为否则
ternary
消息应该打印出来,我们根本看不到缓冲的消息。
我不知道任何c,所以我不知道这个代码是好的还是坏的做法。只是胡搅蛮缠。