我正在尝试创建一个字符缓冲区,如下所示:
#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);
}
但是我的程序退出时说“以非零状态退出”我哪里做错了?
上层同事告诉你动态分配内存,但由于它更容易出错,更难使用(需要释放内存)然后使用自动数组+你知道编译时的大小,没有理由使用动态分配。我建议您改用自动数组。也不要忘记一个字节的空终止字符。
char buf[4];
如果没有其他方法,我们正在使用动态分配。即使您在编译时不知道数组的大小,从c99 开始,您也可以使用VLA。
编译器也可以在结构元素之间/后面添加填充。填充将结构成员与“自然”地址边界对齐。
在你的情况下,它可能看起来像这样
struct gvk{
char a ; // 1B
char b ; // 1B
char c ; // 1B
// 1B padding
};
这意味着在这种情况下它应该工作得很好,无论如何你应该避免memcpy(buf, &k , 3*sizeof(char));
在这样的结构上使用,因为你可能会复制填充而不是结构的真实元素。
也没有必要显式键入sizeof(char)
,按照标准,大小为 1 (B)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句