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) は定義上 1 です。最後に、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++) {

1対多にループしています。

別の問題はこれです:

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

実際の文字列は 16 文字ですが、C の文字列には追加の終止文字 ( ) が必要なため、さらに 1 文字'\0'を割り当てる必要があります。つまり、17 を掛ける必要があります。

また、Dan F が指摘したように、メモリ リークの可能性もあります。

2 つの最大の問題は、ループと割り当てです。これは、未割り当てのメモリを上書きするときに、いわゆる未定義の動作を引き起こすためです。

于 2012-08-10T05:24:37.020 に答える