0

次のように定義された構造体があります

struct _element;
typedef struct _element Element;

struct _element {

    char* StudentName;
    char* StudentID;
    int StudentMarks;
};

構造体へのポインターは、次のようElementにグローバルに宣言されます。

Element * ePtr;

これで、構造体へのポインターを返す関数ができましたElement。これは以下のように定義されています。ePtrグローバルに宣言されたものと同じものがこの関数に取り込まれ、返されます。

Element * CreateElement(char * jName, char * jID, int jMarks)
{
    printf("CreateElement \n");
    puts(jName); puts(jID); printf("%d\n",jMarks);

    ePtr->StudentName = (char*)malloc(sizeof(char)*strlen(jName));

    strcpy(ePtr->StudentName, jName);

    printf("After Creation \n");
    puts(ePtr->StudentName);

    return ePtr;
}

を使用してこの関数を呼び出しています

ePtr = CreateElement(iName,iID,iMarks);

別の関数から。puts関数呼び出し行のすぐ下のandprintfコマンドで示されているように、パラメーターに格納されている値は正しいです。

私の問題は、

ePtr->StudentName = (char*)malloc(sizeof(char)*strlen(jName));

ライン。gdbを使用して同じことを確認しました。

4

3 に答える 3

2

にメモリを割り当てていますePtrか?

この構造体へのポインタをグローバルに宣言するだけでは十分ではありません。mallocそのためのメモリも必要になります: ePtr = malloc(sizeof(Element);.

mallocまた、ヌル ターミネータ用の文字列にスロットを追加してください。

一般に、常にポインターを初期化します。これは、global: を宣言するときに行うことNULLできElement *ePtr = NULL;ます。さらに、ePtrグローバルスコープから抜け出すようにして、メソッドNULLの場合と同様に、ポインターを使用する前に確認しePtrてくださいCreateElement

于 2012-07-24T04:24:34.000 に答える
1

ePtr に含まれる char* にメモリを割り当てる前に、ePtr にメモリを割り当てる必要があります。関数の開始時に ePtr で malloc を実行します。

ePtr をグローバルに宣言することにもほとんど意味がありませんが、これはプログラムを壊すものではありません。

ePtr = (Element*)malloc(sizeof(Element));

おそらく、これを使用する前に ePtr が null かどうかも確認する必要があります (メモリ不足やその他の問題の場合は null になる可能性があります)。

于 2012-07-24T04:29:19.090 に答える
1

メモリを割り当てません

ePtr = (Element*)malloc(sizeof(Element));

値の割り当てを開始し、最終的に関数から返す前に。

また、文字列の nul ターミネータ用のスペースを確保する必要があります

ePtr->StudentName = (char*)malloc(sizeof(char)*(strlen(jName) + 1));

最後に、メモリを割り当てて ID の値をコピーし、studentMarks を Element にコピーすることを忘れないでください。

Element は固定サイズです。char *1 つと同様に 2 つを保持するためのメモリが必要intです。Element にメモリを割り当てる場合、文字列が可変長であることは問題ではありません。

于 2012-07-24T04:24:42.737 に答える