c中的memcpy命令

时间:2011-11-09 13:44:05

标签: c

#include<stdio.h>
#include<string.h>
int main()
{
  unsigned char *s;
  unsigned char a[30]="Hello world welcome";
  memcpy(s,&a,15);
  printf("%s",s);
  return 0;
}

这给了我一个分段错误。请帮我修复此错误

2 个答案:

答案 0 :(得分:11)

您需要为s分配内存。就目前而言,它只是一个未经初始化的指针(很可能)无处可指:

unsigned char *s = malloc(16);

与所有内存分配一样,当你使用它时应该释放它:

free(s);

编辑:另一个错误(我忽略了)是你在调用memcpy后需要NULL终止。

memcpy(s,a,15);
s[15] = '\0';

或者,您可以使用strcpy(),并将字符串截断为15个字符,但是您需要分配足够的内容来存储所有a(包括其NULL终止符):

unsigned char a[30]="Hello world welcome";
unsigned char *s = malloc(strlen(a) + 1);   //  Allocate
strcpy(s,a);        //  Copy entire string
s[15] = '\0';       //  Truncate to 15 characters by inserting NULL.
printf("%s",s);
free(s);            //  Free s

答案 1 :(得分:4)

a已经是一个指针,当您通过a引用&a时,您将获得a的地址,而不是字符串的地址。您还需要分配一些内存来将字符串复制到malloc。

另一个错误是,通过memcpy只复制15个字节,这意味着你的字符串不是零终止('\ 0')这导致printf()尝试打印s,直到它达到0,这是永远不会发生的。 因此,您必须使用strcpy,给出正确的长度参数或将字符串终止为零。

#include<stdio.h>
#include<string.h>
int main()
{
  unsigned char *s;
  unsigned char a[30]="Hello world welcome";

  s = malloc(strlen(a) + 1); // + 1 for the 0 character
  if (s == NULL)
  {
      perror("malloc");
      exit(1);
  }

  // copy the whole string
  memcpy(s, a, (strlen(a) + 1)); // + 1 for the 0 character
  printf("%s",s);

  // copy the first 15 bytes and 0 terminate
  memcpy(s, a, 15);
  s[15] = '\0';
  printf("%s",s);

  // copy via string copy
  strcpy(s, a);
  printf("%s",s);

  free(s)

  return 0;
}