0

我有一个日期类型定义为 typedef char* DateTime; 格式为“dd/mm/yyyy-hh:mm”,例如“08/08/2012-12:00”

我想分配n个“日期”字符串。以下有什么问题?

    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;
    }
}
4

4 回答 4

7
for (int i = 0; i <= n; i++) {
                   ^

在 C 中,数组从0所以dates[n]无法访问。放下=.

于 2012-08-09T13:00:47.507 回答
3

除了@Dan 和@cnicutar 的回复(两者都在现场),请注意字符串文字 "08/08/2012-12:00" 包含17 个字符(不是16)。虽然它的字符串长度为 16,但它包含您看到的 16 个字符加上末尾的 '\0' 字符作为终止符。此外, sizeof(char) 是定义之一。最后,使用 malloc 分配内存的惯用方法是 -

DateTime *dates = malloc(n * sizeof *dates);
于 2012-08-09T13:28:20.273 回答
2

除了 cnicutar 的回答还有这个:

如果此条件为真:

if ( dates[i] == NULL )

你只是调用free整个数组,而不是释放数组中的元素i。这可能导致严重的内存泄漏

于 2012-08-09T13:12:51.663 回答
0

正如在评论中指出的那样,无论是我还是其他人,循环

for (int i = 0; i <= n; i++) {

循环一次到多次。

另一个问题是这样的:

dates[i] =  malloc(sizeof(char)*16);

实际的字符串是 16 个字符,但是由于 C 中的字符串需要一个额外的终止符 ( '\0'),因此您需要多分配一个字符,这意味着您应该乘以 17。

正如 Dan F 所指出的,您还存在潜在的内存泄漏。

最大的两个问题是循环和分配,因为这会在覆盖未分配的内存时导致所谓的未定义行为。

于 2012-08-10T05:24:37.020 回答