掲示板ランキング  プラスター(微香・無臭タイプ)  プラスター(肌にやさしい)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7203

構造体
投稿者---tosi(2007/03/07 22:23:38)


下のソースを実行すると not enough memoryと
表示されてしまいます。なぜなんでしょうか?
CPad は LSI C-86 を使っています、OSはXPです。
よろしくお願いします。

#include <stdio.h>

typedef struct
{
    char *name;  /* 名前 */
    int tensuu;  /* 点数 */
}SEISEKI;

int main(void)
{
    int i;
    
    SEISEKI class1[3] =  /* クラス1 */
    {
        {"akagi", 90},
        {"fune", 100},
        {"suzuki", 70},
    };
    
    SEISEKI class2[2] =  /* クラス2 */
    {
        {"yamada", 50},
        {"satou", 90},
    };
    
    SEISEKI *class3;        /* クラス3(ポインタ) */
    
    class3 = class1;        /* クラス1を代入 */
    
    for(i=0; i<2; i++)    /* クラス1の後ろにクラス2を代入 */
    {
        (class3+3+i)->name = class2[i].name;
        (class3+3+i)->tensuu = class2[i].tensuu;
    }
    
    for(i=0; i<5; i++)    /* クラス3を表示 */
    {
        printf("%s\n", class3[i].name);
        printf("%d\n", class3[i].tensuu);
    }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体 7205 yoh2 2007/03/07 23:08:46


No.7205

Re:構造体
投稿者---yoh2(2007/03/07 23:08:46)


配列宣言で確保した領域を超えたところに書き込みを行っているため、領域破壊を起こしています。

実際にメモリが足りないのではなく、メモリ領域が破壊されてでたらめな挙動をした
結果としてたまたま not enough memory と表示されたのでしょう。

    ...
              /*** ↓ 3つ分しか確保していないのに、***/
    SEISEKI class1[3] =  /* クラス1 */
    {
        {"akagi", 90},
        {"fune", 100},
        {"suzuki", 70},
    };

    ...

    SEISEKI *class3;        /* クラス3(ポインタ) */
    
    class3 = class1;        /* クラス1を代入 */
    
    for(i=0; i<2; i++)    /* クラス1の後ろにクラス2を代入 */
    {
        /*** [3]以降への代入 → 領域破壊                    ***
         *** class3+3+iは、ループ直前の代入と合わせて考えると ***
         *** class1[3+i]と同義。                         ***/
        (class3+3+i)->name = class2[i].name;
        (class3+3+i)->tensuu = class2[i].tensuu;
    }



この投稿にコメントする

削除パスワード

No.7206

Re:構造体
投稿者---yoh2(2007/03/07 23:12:28)


コメントにミスがありました。
         *** class3+3+iは、ループ直前の代入と合わせて考えると ***
         *** class1[3+i]と同義。                         ***/

同義なのは、(class3+3+i)->フィールド と、class1[3+i].フィールド です。


この投稿にコメントする

削除パスワード

No.7207

Re:構造体
投稿者---tosi(2007/03/07 23:39:02)


>同義なのは、(class3+3+i)->フィールド と、class1[3+i].フィールド です。

一度構造体を代入するとそのサイズになってしまうんですね、そのまま
続けて代入できるかと思っていました。

解決しました、ありがとうございました。


この投稿にコメントする

削除パスワード

No.7216

Re:構造体
投稿者---かずま(2007/03/10 09:33:04)


> 一度構造体を代入するとそのサイズになってしまうんですね、そのまま
> 続けて代入できるかと思っていました。

「配列を宣言するとそのサイズになってしまう」と書いてほしかった。
構造体とは無関係です。配列の問題です。

次のようなことはできません。
int a[3] = { 11, 22, 33 }, b[2] = { 44, 55 };
for (i = 0; i < 2; i++) a[3+i] = b[i];




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ