2016-12-29 6 views
-1

このコードがありますが、うまくいかない、何が問題なのですか? 私はadd_sala()の2回目の使用の後で、動的サイズ(C言語) で構造体を大量に作成しようとしています。主な機能はWindowsのクローズドプログラムです。 この問題を解決するためにお手伝いください!ありがとう! Cで構造体を持つCの動的メモリ

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 
char trash[50]; 
int dyn_sala_id=1; 
typedef struct 
{ 
    int id; 
    char number[6]; 
    int persons; 
    char tech_inf[256]; 
} sala; 
sala *sala_; 

int add_sala() 
{ 
    int persons; 
    char number[6], tech_inf[256]; 


    sala_ = (sala*)realloc(sala_,dyn_sala_id * sizeof(sala)); 

    printf("Wpisz numer sali(max. 5 znakow): "); 
    fgets(number,6,stdin); 
    if(strlen(number)>5) 
    { 
     printf("Numer musi byc nie wiecej, niz 5 znakow!\n"); 
     fflush(stdin); 
     add_sala(); 
     return 0; 
    } 

    printf("Wpisz ilosc osob, ktora wmiesci sie w sale(max. 1000 osob): "); 
    scanf("%d", &persons); 
    if(persons==0 || persons>1000) 
    { 
     printf("Nie wolno wprowadzic litery oraz max. ilosc osob to 1000\n"); 
     fflush(stdin); 
     add_sala(); 
     return 0; 
    } 

    printf("Wpisz info o wyposazeniu sali(max. 255 znakow): "); 
    fgets(trash,50,stdin); 
    fgets(tech_inf,256,stdin); 
    if(strlen(tech_inf)>255) 
    { 
     printf("Info musi byc nie wiecej, niz 255 znakow!\n"); 
     fflush(stdin); 
     add_sala(); 
     return 0; 
    } 

    sala_[dyn_sala_id].id = dyn_sala_id; 
    strncpy(sala_[dyn_sala_id].number, number, 6); 
    sala_[dyn_sala_id].persons = persons; 
    strncpy(sala_[dyn_sala_id].tech_inf, tech_inf, 256); 
    printf("\nSala zostala dodana!\n\n"); 
    printf("%d, %d, %s, %s",dyn_sala_id, persons, number, tech_inf); 
    dyn_sala_id+=1; 
    return 0; 
} 

int main() 
{ 
    add_sala(); 
    printf("%s",sala_[1].number); 
    add_sala(); 
    printf("'%s'",sala_[1].number); 
    printf("'%s'",sala_[2].number); 
    return 0; 
} 
+0

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由については、このディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+0

ようこそスタックオーバーフロー。デバッガを使用してコードを1行ずつ表示する方法を学ぶ必要があると思われます。これにより、発生している問題の性質と場所を簡単に特定できるようになります。デバッガの使用は、あらゆる目的のために、どのプログラマにとっても必要な知識です。詳細は、[小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。 –

答えて

1

配列はmain()に配列インデックスが1

add_sala(); 
printf("%s",sala_[1].number); 
add_sala(); 
printf("'%s'",sala_[1].number); 
printf("'%s'",sala_[2].number); 

ではオフになっていますので、また機能add_sala()で、それが初めて呼び出されたときは、あなたが持っていることは明らかである、0からインデックス化されていますあなたは RECOにメモリを割り当てるために使用するグローバル

int dyn_sala_id=1; 

その同一の関数でビットさらなるダウン

sala_ = (sala*)realloc(sala_,dyn_sala_id * sizeof(sala)); 

とRDしかし、インデックス付けは1だけ離れ再び、唯一つのアレイ要素がはっきりある

sala_[dyn_sala_id].id = dyn_sala_id; 

そして、(私はできませんがエラーメッセージを読んでください)明らかに悪い入力の後で、関数を再帰するのは奇妙に思えます。また、あなたは

fflush(stdin); 

未定義の動作を持っており、コードは動作しませんので、私は、さらに見ていません。

関連する問題