C或C ++ sprintf和struct中的值

时间:2014-02-20 12:08:56

标签: c printf

sprintf(tmp, "xbitmap_width %d\n", symbol->scale);

输出:

xbitmap_width 1075052544

预期产出 - 规模值为5,因此它应该是:

xbitmap_width 5

我缺少什么?为什么sprintf取指针值?

1 个答案:

答案 0 :(得分:2)

更新
如果symbol->scale确实不是指针,那么也要确保tmp足够大,以避免溢出。我希望tmp 至少 18个字符大,但最好使它足够大(如30或更大),如果它在堆上分配:初始化为零:{{1或者memset会更好。

您可能还希望确保calloc(30, sizeof *tmp)不是函数返回的堆栈值。这也是未定义的行为。但是,如果你说你正在使用symbolnew(_不会初始化结构,BTW),那就不是问题了。
这里的非初始化位(当使用malloc时)可能是:malloc仅保留足够的内存来存储给定对象一次或多次。但是,内存已初始化:

malloc

就像你给一群猴子类型作家那样的东西:最终其中一个人可能会在莎士比亚的一行中pun::::well well well well:::::::::::::::::::::::::::最终其中一个可能最终包含字符串“不要恐慌” 现在,这不是完全是真的,但你明白了...... 为确保您的结构初始化,请使用char *str = malloc(100); malloc那些让您感到悲痛的成员。

如果您的结构如下所示:

calloc

然后您将{{1>}的传递给memset。该值是内存地址,而不是int。一个int,因为你可能没有保证至少2个字节的大小(尽管它通常是4个)。指针的大小为4或8个字节,因此传递指针,并将struct symbol { int *scale; } 解释为scale,就会得到未定义的行为。

在您的案例中打印sprintf

sprintf

但这是未定义的行为:

int

哦,正如评论中所述:5struct symbol *symbol = malloc(sizeof *symbol); int s = 5; symbol->scale = &s; printf("%d\n", *(symbol->scale));//dereference the scale pointer printf("%d\n", symbol->scale);//passing pointer VALUE ==> memory address //for completeness & good practices' sake: free(symbol); snprintf的内容,而sprintfstrncpy :使用允许您指定最多设置的字符数的函数更安全