我定义了这个函数:
struct heap_validation {
size_t num_alloc;
size_t num_alloc_sz;
struct memory *mem;
};
...
bool get_isallocated(struct metadata_record *);
当我从hashtable_traverse调用heap_validation函数并打印结果时,我得到了以下值:0,255,246
void hashtable_traverse(struct metadata_record *metarec,
struct heap_validation *heap_val) {
printf("get_isallocated(metarec): %d\n",get_isallocated(metarec));
bool retrieved = false;
bool allocated = get_isallocated(metarec);
if (allocated) {
heap_val->num_alloc += 1;
我也试过%d,我得到了相同的结果。
答案 0 :(得分:1)
如果您不包含<stdbool.h>
,则bool
不能保证为_Bool
。
在C ++(§4.5/ 4)中,当一个值转换为bool
时,它变为0或1:
bool类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1。
在C(§6.3.1.2/ 1)中,当一个值转换为_Bool时,它变为0或1:
当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果是1。
如果您获得的值除零和一之外,则bool
不是_Bool
而get_isallocated()
返回的值除零或一之外:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
_Bool x=69;
printf("x=%d\n",x);
exit(EXIT_SUCCESS);
}
将打印出x=1
。
答案 1 :(得分:0)
如果我理解你是正确的,那么也许你想要布尔输出: -
printf("get_isallocated(metarec): %d\n",get_isallocated(metarec)!=0);
或
printf("get_isallocated(metarec): %s\n",get_isallocated(metarec)!=0?"True":"False");
它会输出0
或1
。
答案 2 :(得分:0)
您应该从0
1
类型中获取值stdbool.h
或bool
。
如果不是这种情况,您的程序(可能是get_isallocated
函数)正在调用未定义的行为,或者您没有使用bool
中的stdbool.h
,而是使用另一个标准整数类型的别名
答案 3 :(得分:0)
事实证明,函数“hashtable_traverse”是GLib的g_hash_table_foreach()调用以迭代GHashTable的函数,它需要键和值。我只有值和指向用户数据的指针。
metarec是值,键应该是地址指针(第一个参数),而heap_val是用户数据,在g_hash_table_foreach()
中是可选的