memcpyでゴミが付加されてしまう・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

memcpyでゴミが付加されてしまう・・・

#1

投稿記事 by 初心者 » 16年前

以下【ソース例】のように文字列を分割して
格納させようとしたのですが、【出力結果】のように
最後にゴミが付加されてしまいます。

ネットで調べてみたのですが、原因がわかりませんでした。。。
すいませんが、原因と解決策をご教示頂きたいです。

【ソース例】
typedef struct st {
char* a;
} ST;

main( void )
{
ST st;
char* a1;
char* a2;

memset( st, 0, sizeof( ST ) );
a1 = ( char * )calloc( 10, sizeof( char ) );
a2 = ( char * )calloc( 10, sizeof( char ) );

st->a = '12345ABCDEあああああ';

memcpy( a1 , st->a , sizeof( char[10] ) );
memcpy( a2 , st->a+10, sizeof( char[10] ) );

printf( "a1 = %c\n", a1 );
printf( "a2 = %c\n", a2 );

free( a1 );
free( a2 );
}

【出力結果】
a1 = 12345ABCDE"#?
a2 = あああああ・

box

Re:memcpyでゴミが付加されてしまう・・・

#2

投稿記事 by box » 16年前

申し訳ありませんが、ヘッダーファイルのインクルードをはしょらずに、
お手元にあるコードを「そっくりそのままコピー&ペーストして」
載せていただけないでしょうか。

こちらで、必要なヘッダーファイルをインクルードしてから
コンパイルしたところ、

>memset( st, 0, sizeof( ST ) );
>st->a = '12345ABCDEあああああ';
>memcpy( a1 , st->a , sizeof( char[10] ) );
>memcpy( a2 , st->a+10, sizeof( char[10] ) );

この4行でコンパイルエラーが出ました。
お手元のコードはコンパイルエラーが出ないのでしょうか?

kazuoni

Re:memcpyでゴミが付加されてしまう・・・

#3

投稿記事 by kazuoni » 16年前

そうですね^^;
確かに普通のCコンパイラだと
まずmemset通らないですよね^^;

初心者

Re:memcpyでゴミが付加されてしまう・・・

#4

投稿記事 by 初心者 » 16年前

すいません。
職場のソースなので手元になく、思い出して
簡略化して書いたソースで、コンパイルもしておりません。。申し訳ないです。

構造体内のchar*型の文字列を別のchar*変数にmemcpyで分割して
正常にコピーできるのかだけでもご教示頂きたいです。

よろしくお願いいたします。

box

Re:memcpyでゴミが付加されてしまう・・・

#5

投稿記事 by box » 16年前

こういうことがしたかったのでしょうか。
おしりにゴミが付くのは、たぶん'\0'できちんと終端させていないからだと思います。


#include <stdio.h>
#include <stdlib.h>

typedef struct st {
    char *a;
} ST;

int main(void)
{
    ST *st;
    char *a1, *a2;

    st = (ST *) malloc(sizeof(ST));
    if (!st) fprintf(stderr, "malloc error\n"), exit(1);
    
    a1 = (char *) calloc(10 + 1, sizeof(char));   // +1 は終端の'\0'の分
    a2 = (char *) calloc(10 + 1, sizeof(char));   // 同上
    if (!a1 || !a2) fprintf(stderr, "calloc error\n"), exit(1);
    
    st->a = "12345ABCDEあああああ";
    memcpy(a1, st->a , 10);
    memcpy(a2, st->a + 10, 10);
    
    printf("a1 = %s\n", a1);
    printf("a2 = %s\n", a2);

    free(st);
    free(a1);
    free(a2);
    return 0;
}

初心者

Re:memcpyでゴミが付加されてしまう・・・

#6

投稿記事 by 初心者 » 16年前

なるほど!
'\0'できちんと終端するために、
+1でメモリ確保するんですね!
ありがとうございました。
明日試してみます!!

閉鎖

“C言語何でも質問掲示板” へ戻る