打印由未初始化为零的 calloc 分配的内存值

Printing the value of memory allocated by calloc not initialized to zeroed

当我尝试使用 calloc 而不是 malloc 时,我对发生的事情感到困惑。我的理解是 calloc 分配内存并将每个地址的值初始化为零,而 malloc 只是分配内存。但是,当我尝试打印每个地址的值时,我希望 calloc 的值为零,malloc 的随机字符 - 但它们不是......它们无论如何都是一样的我做的。

typedef struct {
    char* text;
    void* obj;
} statement_t;

void* stalloc() {
    return calloc(1, MODEL_OBJ_CAPACITY);
    // return malloc(MODEL_OBJ_CAPACITY); Also used this
};

statement_t NewStatement(char* text) {
    statement_t statement;
    statement.text = text;
    statement.obj = stalloc();

    return statement;
};


int main(void) {
    statement_t statement = NewStatement("CREATE job Manager");

    for(int n = 0; n < 10; ++n) {
        printf("statement[%d]: %c\n", n, (char)&statement.obj[n]); // Note I've tried a number of ways to print this but they always end up being the same
    }

    ...
}

来自calloc的输出:

statement: CREATE job Manager 0x7fb127405c60 8
statement[0]: `
statement[1]: a
statement[2]: b
statement[3]: c
statement[4]: d
statement[5]: e
statement[6]: f
statement[7]: g
statement[8]: h
statement[9]: i

来自malloc的输出:

statement: CREATE job Manager 0x7f8becc05c60 8
statement[0]: `
statement[1]: a
statement[2]: b
statement[3]: c
statement[4]: d
statement[5]: e
statement[6]: f
statement[7]: g
statement[8]: h
statement[9]: i

如您所见,它们是相同的...我错过了什么?

您打印不正确:

printf("statement[%d]: %c\n", n, (char)&statement.obj[n]); 

您正在尝试打印数组中每个字节的 地址 ,而不是字节本身。此外,通过使用 %c 您将打印与每个字节值关联的字符而不是实际值。

首先将void *转换为char *,然后索引数组。另外,使用%d打印每个字节的值:

printf("statement[%d]: %d\n", n, ((char *)statement.obj)[n]); 

obj 的类型为 void*。 C 标准不允许对 void 指针进行任何指针运算。无法索引 void *.

它是一个 gcc 扩展,不可移植。

尝试:

printf("statement[%zu]: %d\n", n, ((char *)statement.obj)[n]);

    int c;

    for(size_t n = 0; n < 10; ++n) {
        c = ((char *)statement.obj)[n];
        printf("statement[%zu]: %s : %d (0x%02x)\n", n, (c >= 32 && c <= 127) ? (char []){'\'', c, '\'', 0} : "not printable", c, c ); 
    }