2016-05-29 25 views
1

の要素を印刷することはできません:SimGridダイナミックアレイ。私は、このような文字列を持っている配列

char *string = "String"; 

私は動的配列を作成しました:その後、私は取得したい

xbt_dynar_push(dynar, string); 

xbt_dynar_t dynar = xbt_dynar_new(sizeof(char[20]), NULL); 

dynarにこの文字列が追加されましたがこの文字列を動的配列から取り出し、それを印刷します。

char *str = xbt_dynar_get_as(dynar, 0, char*); 

printf("%s\n", str); 
printf("%s\n", *str); //I tried this also 

出力が表示されないのはなぜですか?

答えて

2

あなたは20バイトのオブジェクトを保存することをライブラリに伝えていますが、7バイトのオブジェクトを渡しています。このオブジェクトは文字列リテラル:"String"です。

しかし、その後、あなたではなく、オブジェクト全体のオブジェクトへのポインタを取得しようとしている:char *str = xbt_dynar_get_as(dynar, 0, char*);

はどちらもあまり意味がありません。オブジェクト全体、またはそのオブジェクトへのポインタを格納します。

したがって、20文字を保持する構造体を使用してください。このような何か:

typedef struct 
{ 
    char data[20]; 
} shortstr ; 

shortstr s = { "String" } ; 
xbt_dynar_t dynar = xbt_dynar_new(sizeof(shortstr), NULL); 
xbt_dynar_push(dynar, &s); 
string* p = xbt_dynar_get_ptr(dynar, 0); 
printf("%s" , p->data); 

二番目のオプションを使用すると、文字列リテラルと、割り当てられた文字列を混在させないために非常に注意する必要があります。その場合には、文字列へのポインタを格納することです。これは、文字列リテラル保存する方法です(そして唯一の文字列リテラルを!):

char* s = "String" ; 
xbt_dynar_t dynar = xbt_dynar_new(sizeof(char*), NULL); 
xbt_dynar_push(dynar, &s); 
char* p = xbt_dynar_get_ptr(dynar, 0); 
printf("%s" , p); 

第三の選択肢は、(それらのすべてが同じアロケータで割り当てする必要がある)の文字列を割り当て、配列にそれらをプッシュすることですその場合、割り当て解除は自動的に行われます。ドキュメントの例を参照してください。http://simgrid.gforge.inria.fr/simgrid/3.9/doc/group__XBT__dynar.html#XBT_dynar_exptr

+0

最後のコード例はエラーです。それは "yh @"を印刷します –

+0

@RomaKarageorgievichドキュメントごとに例を書いて動作するようにしました。コンパイルする実際の例については、ドキュメントを参照してください。 – 2501

関連する問題