2


現時点では、Cの動的配列を理解しようとしています。ポインタ「ptr」にメモリを割り当てると、必要な要素数(malloc関数)を入力しなくても機能します。
さて、問題は、なぜそれが機能しているのか理解できないことです。
誰かが私にいくつかのアドバイスをしてくれるなら、素晴らしいでしょう。ありがとう。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct daten
{
    char name[20];
    int alter;
};

int main(void)
{
    struct daten *ptr;
    int i;

    ptr = malloc(sizeof(struct daten *)); //works fine!!
    //ptr = malloc(sizeof(struct daten *)*4);
    strcpy(ptr[0].name, "Daniel");
    ptr[0].alter = 23;

    strcpy(ptr[1].name, "Fabian");
    ptr[1].alter = 29;

    strcpy(ptr[2].name, "Helmut");
    ptr[2].alter = 34;

    strcpy(ptr[3].name, "Katrin");
    ptr[3].alter = 21;

    for(i = 0; i<4; i++)
    {
        printf("%s\t", ptr[i].name);
        printf("%d\n", ptr[i].alter);

    }

    return 0;
}
4

5 に答える 5

2

これは未定義の動作であるため、何が起こる可能性もあります。プログラムは正常に動作する可能性があります。しかし、それが正しいプログラムであるという意味ではありません。

したがって、これを行うのに十分なメモリ、つまりバイトを割り当てる必要があります。sizeof(struct daten) * 4

于 2013-01-13T16:37:01.463 に答える
2

キーワードは「うまく動かない」ということです。せいぜい動作しているようです。

ここにあるのは未定義の動作です(ただし、1つの構造体にスペースを割り当てているため、はるかに大きなスペースに書き込んでいます)。未定義動作は何でもできます。プログラムがクラッシュしなければならないという意味ではありません。これには、「正常に機能する」可能性があることも含まれます。

また、どのくらいのメモリを割り当てる必要があるかを誤解しています。タイプTのポインタに割り当てられたタイプの場合、次のようT *sizeof(T)バイトを割り当てる必要があります。

ptr = malloc(sizeof(struct daten) * 4);

さらに良い:

ptr = malloc(sizeof(*ptr) * 4);
于 2013-01-13T16:37:41.173 に答える
0

これは未定義の動作です。あなたはそれが機能していることを単に(不)幸運です。別のシステムでこれを試してみると、機能する場合と機能しない場合があります。

やったほうがいい :

ptr = malloc(sizeof(struct daten)*4);

割り当てられたスペースの直後にデータがメモリに書き込まれている可能性があるため、操作は成功しています。これは未割り当て領域であるため、問題はなく、ですworking。このスペースを使おうとすると問題が発生します

于 2013-01-13T16:37:58.060 に答える
0

うーん、あなたは未割り当て領域に書き込むだけです。これは機能しますが、長期的には、未割り当て領域への書き込みによってヒープが破損する可能性が非常に高く、連続するmallocが失敗したり、プログラムがクラッシュしたりする可能性があるため、クラッシュが発生します。

于 2013-01-13T16:39:51.467 に答える
0

ptr[3]として表すこともできます。*(ptr + 3)ここで、「3」はにスケーリングされ(3 * sizeof(*p))ます。つまり、割り当てたメモリをはるかに超えたメモリ位置にデータをコピーしています。

あなたは幸運です、あるいは多分私はあなたが不運だと言うべきです。あなたがしたことは、誰かをランダムに刺すようなものです。重要な臓器に当たるか、当たらないかもしれません。今回はデバッグせずにコードをコンパイルして(たとえば)メモリレイアウトを変更すると、プロセスを強制終了する可能性があります。あるいは、殺さないで、けがをするだけかもしれません。

Cでのプログラミングを規律しなければならない理由の1つに出くわしました。いいえ、それは「機能」しませんでした、あなたのテストはそれが失敗したことを示すのに十分ではありませんでした。

も参照してくださいcalloc

于 2013-01-13T16:43:18.490 に答える