#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;
}
これは私にセグメンテーションエラーを与えています。このエラーを修正するのを手伝ってください。memcpyコマンドで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;
}
これは私にセグメンテーションエラーを与えています。このエラーを修正するのを手伝ってください。memcpyコマンドでC
a
が既にポインタである場合、a
の参照を&a
で取得すると、文字列のアドレスの代わりにa
のアドレスが取得されます。さらに、malloc経由で文字列をコピーするために、いくつかのメモリを割り当てる必要があります。
もう1つのエラーは、memcpyを使用して15バイトしかコピーしないということです。これは文字列がゼロで終わらないことを意味します( '\ 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;
}
s
のメモリを割り当てる必要があります。
unsigned char *s = malloc(16);
そして、あなたがそれを使用して行われているとき、すべてのメモリ割り当てのように、それは解放されなければならない:
free(s);
現状では、それはどこにもその(最も可能性が高い)の点だけで初期化されていないポインタです編集:他の間違い(私が見落とした)memcpy
を呼び出した後にNULLを終了する必要があります。
memcpy(s,a,15);
s[15] = '\0';
また、あなたはstrcpy()
を使用し、15文字までの文字列を切り捨てていますが、(そのNULLターミネータを含む)a
のすべてを格納するのに十分割り当てる必要がありますできます
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
thatsスマート!良い点 – niko
@Angus:DipSwitchの答えは正しいですが、この種のものには 'strcpy'や' memcpy'の代わりに 'strncpy'を使うべきだと思います。 – Brian
'a'はポインタではなく、配列です。 'a'と'&a'は実際には同じ値を持ちます。なぜなら、配列は個々の状況でポインタに「崩壊する」ためです。 – JeremyP