【发布时间】:2021-11-20 22:40:11
【问题描述】:
当我尝试使用 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
如您所见,它们是相同的......我错过了什么?
【问题讨论】:
-
statement_t是什么? -
MODEL_OBJ_CAPACITY是什么?calloc()分配了多少非常重要。 -
我不认为这些是随机值 - 注意第一个值对应于
0x60,下一个对应于0x61,等等。 -
这段代码是非法的,你不能在标准 C 中的
void *上使用[]。请以一致模式调用编译器,以避免在编译时应该拒绝的程序上因运行时错误而浪费时间 -
@M.M 提出了一个很好的观点,解决编译器已经发现的问题是浪费大家的时间。为了防止这种情况,我建议关注What compiler options are recommended for beginners learning C? 突然我们得到 "ISO C 不允许额外的 ';'在函数之外“,”错误:在算术中使用的“void *”类型的指针”和大量其他错误,其中大部分是不言自明的。
标签: c pointers dynamic-memory-allocation