代码之家  ›  专栏  ›  技术社区  ›  The Fool

数组数据丢失

  •  0
  • The Fool  · 技术社区  · 7 月前

    当我运行以下程序时,我不明白为什么 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,所以我不知道这个代码是好的还是坏的做法。只是胡搅蛮缠。

    1 回复  |  直到 7 月前
        1
  •  1
  •   Eric Postpischil    7 月前

    Buffer_write 增量 b->data 对于 b ,它传递了的地址 bufw.impl 所以 bufw.impl.data 递增,不再指向数组的开头 data . buf 稍后设置为的副本 bufw.impl 。所以,什么时候 fprint(&stdoutw, buf.data); 被执行, buf.data 指向复制到的字符串之后 数据 。那里的内存未初始化。