#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;
}
这给了我一个分段错误。请帮我修复此错误
答案 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;
}