c - 为什么多次调用 calloc 会使我的应用程序崩溃?
问题描述
我有一个函数来初始化一个包含嵌套结构和数组的结构。在初始化结构时,我多次调用calloc
.
参考下面的代码:
typedef struct
{
int length;
uint8_t *buffer;
} buffer_a;
typedef struct
{
int length;
uint8_t *buffer;
int *second_buffer_size;
uint8_t **second_buffer;
} buffer_b;
typedef struct
{
int max_length;
buffer_a *buffer_in;
buffer_b *buffer_out;
} state_struct;
state_struct *init(int size, int elements) {
size_t struct_size = sizeof(state_struct);
state_struct *s = (state_struct*) calloc(struct_size, struct_size);
log("Building state with length %d", size);
s->max_length = size;
size_t buffer_in_size = s->max_length * sizeof(buffer_a);
s->buffer_in = (buffer_a*) calloc(buffer_in_size, buffer_in_size);
size_t buffer_out_size = s->max_length * sizeof(buffer_b);
s->buffer_out = (buffer_b*) calloc(buffer_out_size, buffer_out_size);
log("Allocated memory for both buffers structs");
for (int i = 0; i < s->max_length; ++i) {
size_t buf_size = elements * sizeof(uint8_t);
s->buffer_in[i].buffer = (uint8_t*) calloc(buf_size, buf_size);
s->buffer_in[i].length = -1;
log(s, "Allocated memory for in buffer");
s->buffer_out[i].buffer = (uint8_t*) calloc(buf_size, buf_size);
s->buffer_out[i].length = -1;
log(s, "Allocated memory for out buffer");
size_t inner_size = elements * elements * sizeof(uint8_t);
size_t inner_second_buffer_size = elements * sizeof(int);
s->buffer_out[i].second_buffer = (uint8_t**) calloc(inner_size, inner_size);
s->buffer_out[i].second_buffer_size = (int*) calloc(inner_second_buffer_size, inner_second_buffer_size);
log(s, "Allocated memory for inner buffer");
}
return s;
}
打印 for 循环之前的日志,但程序崩溃并且循环内的第一个日志语句没有被打印出来。
为什么会这样?
解决方案
所以这可能不是你问题的答案,但这里是:当我运行这段代码(在 Ubuntu,gcc 7.4 上),并用 替换所有log
函数时printf
,它成功完成。我怀疑问题可能出在您使用日志功能的方式上。您指定它一直工作到循环内的第一个日志调用。您没有指定该log
函数的作用,或者它是一个函数还是只是一个宏包装器printf
,但是您在循环中以不同的方式调用它 - 第一个参数*state_struct
不是格式字符串。
此外,您调用的方式calloc
似乎在语义上不正确。第一个参数应该是你要分配的第二个参数大小的块数(在这种情况下大概是1)
推荐阅读
- jquery - 使用 $.when.apply 等待几个主干模型保存
- sql - 在列分配中跳过 NULL 值
- angular - Masonry js 仅在 Ionic 4 中显示单列
- matplotlib-basemap - cartopy中底图的npts功能的替代功能是什么?
- java - 如何在实体类中查找没有属性
- python - AttributeError:“list”对象没有属性“h3”(Beautifulsoup)
- google-chrome-extension - Chrome 扩展更改边框半径和位置
- c# - 为什么 HttpClient 似乎在没有 .Result 的情况下挂起?
- mysql - 我如何分组,排序和取出mysql中的第一个N?
- c++ - 是否有一个库/代码被剪断,它可以将网格转换为向量表示中的 sdf 以实现亚体素精确表示?