码
sprintf(tmp, "xbitmap_width %d\n", symbol->scale);
输出:
xbitmap_width 1075052544
预期产出 - 规模值为5,因此它应该是:
xbitmap_width 5
我缺少什么?为什么sprintf
取指针值?
答案 0 :(得分:2)
更新
如果symbol->scale
确实不是指针,那么也要确保tmp
足够大,以避免溢出。我希望tmp
至少 18个字符大,但最好使它足够大(如30或更大),如果它在堆上分配:初始化为零:{{1或者memset
会更好。
您可能还希望确保calloc(30, sizeof *tmp)
不是函数返回的堆栈值。这也是未定义的行为。但是,如果你说你正在使用symbol
或new
(_不会初始化结构,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
哦,正如评论中所述:5
是struct 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
的内容,而sprintf
是strncpy
:使用允许您指定最多设置的字符数的函数更安全