2017-08-30 97 views
0

我试图创建人物的缓冲工作,如下所示:用的memcpy为缓冲区

#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); 
} 

但我的程序退出说 在哪里我做错了“非零状态退出”?

+0

'char buf [4];'...'sprintf(buf,“%c%c%c”,ka,kb,kc);' – BLUEPIXY

+2

您需要为'buf'分配内存并终止如果你想使用'%s'打印,则用'\ 0'。此外,假设'sizeof(gvk)'是3个字节并不是一个好主意。 –

+0

了解更多关于[未定义的行为](https://en.wikipedia.org/wiki/Undefined_behavior)并努力工作以避免它。使用[GCC](http://gcc.gnu.org/)...)编译所有警告和调试信息('gcc -Wall -Wextra -g')。学会使用调试器('gdb')和[valgrind](http://valgrind.org/) –

回答

2

Collegue上告诉你,动态分配内存,但由于其更容易出错更难与工作(需要免费内存)然后用自动数组+ 你知道编译时的大小,没有理由使用动态分配。我会建议你使用自动数组。也不要忘记一个字节为null结束字符。

char buf[4]; 

如果没有其他方法,我们正在使用动态分配。即使你在编译时不知道数组的大小,因为你可以使用VLA's。


此外编译可以添加填充之间/后面结构元件。填充aligns结构成员为“自然”地址边界。

在你的情况下,将可能看起来像这样

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

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


而且没有必要明确地键入sizeof(char)其中,通过标准,具有尺寸1(B)。

1

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

应声明它是这样的(动态):

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

如果他想用'%s'打印 –

+1

'sizeof(char)'* * 1的定义 –