SimGrid动态数组。无法打印数组元素

时间:2016-05-29 12:44:10

标签: c simgrid

我有这样的字符串:

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

为什么我看不到任何输出?

1 个答案:

答案 0 :(得分:3)

您告诉库您要存储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