使用 memcpy 作为缓冲区

working with memcpy for buffers

我正在尝试创建字符缓冲区,如下所示:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct gvk{
  char a ;
  char b ;
  char c ;
};

int main(){
  char *buf;
  struct gvk k = {'A','B','C'};

  memcpy(buf, &k , 3*sizeof(char));
  printf("values in buf is %s\n",buf);
}

但是我的程序正在退出说 "exited with non-zero status" 我哪里做错了?

你必须在使用之前分配内存 buf 否则它是未定义的行为。

你应该这样声明(动态地):

char *buf = malloc(sizeof(char)*4);

College upper 告诉你动态分配内存,但由于它更容易出错更难使用(需要释放内存)然后使用自动数组+ 你知道编译时的大小,没有理由使用动态分配。我建议您改用自动数组。也不要忘记空终止字符的一个字节。

char buf[4];

如果没有其他办法,我们正在使用动态分配。即使您在编译时不知道数组的大小,因为 you may use VLA's.


编译器 也可以 添加填充 between/behind 结构元素。将 aligns 结构成员填充到 "natural" 地址边界。

你的情况可能看起来像这样

struct gvk{
  char a ;   // 1B
  char b ;   // 1B
  char c ;   // 1B
             // 1B padding
};

这意味着在这种情况下它应该工作得很好,无论如何你应该避免在这样的结构上使用 memcpy(buf, &k , 3*sizeof(char));,因为你可能会复制填充而不是结构的真实元素。


也没有必要显式输入 sizeof(char),按照标准,它的大小为 1 (B)。