SimGrid 动态数组。无法打印数组元素
SimGrid dynamic array. Cannot print element of array
我有这样的字符串:
char *string = "String";
我创建了一个动态数组:
xbt_dynar_t dynar = xbt_dynar_new(sizeof(char[20]), NULL);
将此字符串添加到 dynar
:
xbt_dynar_push(dynar, string);
然后我想从动态数组中获取这个字符串并打印它:
char *str = xbt_dynar_get_as(dynar, 0, char*);
printf("%s\n", str);
printf("%s\n", *str); //I tried this also
为什么我看不到任何输出?
您告诉库您要存储一个 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
我有这样的字符串:
char *string = "String";
我创建了一个动态数组:
xbt_dynar_t dynar = xbt_dynar_new(sizeof(char[20]), NULL);
将此字符串添加到 dynar
:
xbt_dynar_push(dynar, string);
然后我想从动态数组中获取这个字符串并打印它:
char *str = xbt_dynar_get_as(dynar, 0, char*);
printf("%s\n", str);
printf("%s\n", *str); //I tried this also
为什么我看不到任何输出?
您告诉库您要存储一个 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