0

我定义了这个函数:

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 并且得到了相同的结果。

4

4 回答 4

1

如果不包括<stdbool.h>则不bool保证为_Bool.

在 C++(第 4.5/4 节)中,当一个值转换为 时bool,它变为 0 或 1:

bool 类型的右值可以转换为 int 类型的右值,false 变为 0,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

于 2012-10-02T21:52:57.220 回答
0

如果我理解你是正确的,那么也许你想要布尔输出: -

printf("get_isallocated(metarec): %d\n",get_isallocated(metarec)!=0);

或者

printf("get_isallocated(metarec): %s\n",get_isallocated(metarec)!=0?"True":"False"); 

它将输出一个0or 1

于 2012-10-02T21:27:50.097 回答
0

您应该获取值01stdbool.h bool类型。

如果不是这种情况,您的程序(可能是get_isallocated函数)正在调用未定义的行为,或者您没有使用boolfromstdbool.h而是另一个标准整数类型的别名。

于 2012-10-02T21:51:30.620 回答
0

事实证明,函数“hashtable_traverse”是 GLib 的 g_hash_table_foreach() 调用的函数,用于迭代 GHashTable,需要键和值。我只有值和指向用户数据的指针。

metarec 是值,key 应该是地址指针(第一个参数),heap_val 是用户数据,在 g_hash_table_foreach() 中是可选的

于 2012-10-02T23:34:37.777 回答