打印由未初始化为零的 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 );
}
当我尝试使用 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 );
}