我的日期类型定义为 typedef char * DateTime; 格式为“dd / mm / yyyy-hh:mm”,例如“08/08 / 2012-12:00”
我想分配n个字符串,即“dates”。 以下是什么问题?
DateTime* dates = (DateTime* ) malloc(sizeof(char*) * n);
for (int i = 0; i <= n; i++) {
dates[i] = malloc(sizeof(char)*16);
if (dates[i] == NULL) {
free(dates);
return NULL;
}
}
答案 0 :(得分:7)
for (int i = 0; i <= n; i++) {
^
在C数组中,从0
开始,因此无法访问dates[n]
。放下=
。
答案 1 :(得分:3)
除了@Dan和@cnicutar的回复(两者都是现货),请注意字符串文字“08/08 / 2012-12:00”包含 17 字符(不是 16 )。虽然它的字符串长度为16,但它包含您看到的16个字符,在结尾处加上'\ 0'字符作为终结符。而且,sizeof(char)是一个定义。最后,使用malloc分配内存的惯用方法是 -
DateTime *dates = malloc(n * sizeof *dates);
答案 2 :(得分:2)
除了cnicutar的回答,还有这个:
如果这种情况属实:
if ( dates[i] == NULL )
你只是在整个数组上调用free
,而不是释放数组中i
之前的元素。这可能会导致严重的内存泄漏
答案 3 :(得分:0)
正如我所指出的那样,我在评论中,以及其他人,循环
for (int i = 0; i <= n; i++) {
循环一次到多次。
另一个问题是:
dates[i] = malloc(sizeof(char)*16);
实际字符串是16个字符,但由于C中的字符串需要额外的终结符('\0'
),因此需要再分配一个字符,这意味着您应该乘以17。
正如Dan F所指出的,你也有潜在的内存泄漏。
两个最大的问题是循环和分配,因为在覆盖未分配的内存时会导致所谓的未定义行为。