2011-11-09 4 views
3
#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

答えて

4

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; 
} 
+0

thatsスマート!良い点 – niko

+1

@Angus:DipSwitchの答えは正しいですが、この種のものには 'strcpy'や' memcpy'の代わりに 'strncpy'を使うべきだと思います。 – Brian

+0

'a'はポインタではなく、配列です。 'a'と'&a'は実際には同じ値を持ちます。なぜなら、配列は個々の状況でポインタに「崩壊する」ためです。 – JeremyP

11

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 
+2

これはプログラムの唯一のエラーではありません。 – DipSwitch

+0

ええ、そうです、私は 'strcpy()'部分を見逃しました。 – Mysticial

+2

私は&aが間違っていると思う –