2017-02-18 21 views
0

私はCで簡単なプログラムを書いていました。関数間のCの渡し文字列

void changeStatusOfBook(User users[], Book books[]) { 
    char *id= askForBookID(); 
    Book book = getBookById(books, id); 
    . 
    . 
    . 
} 

char * askForBookID() { 
    char id[6]; 
    printf("Tell me which book (ID)\n"); 
    scanf_s("%5s",id, 6); 
    return id; 
} 

Book getBookById(Book books[], char bookID[]) { 
    int counter = 0; 
    //bookID becomes a trash here 
    . 
    . 
    . 
} 

問題は次のとおりです:最初の関数では、私は正しいユーザー文字列入力を得るが、私は第三の機能に渡したときに、私はそれにいくつかのゴミを取得しています、私は3つの機能を持っています。それを修正するには?

+0

すべての警告とデバッグ情報でコンパイルします。引数として渡されると、配列はポインタに崩壊することに注意してください。 –

答えて

3

関数からローカル変数char id[]を返すことはできません。そのメモリはスタック上にあり、関数がその関数のすべてのスタックメモリを返し、ローカル変数にアクセスできなくなったときです。

メモリが別のプログラム用にスタック上に必要な場合は、メモリidのメモリ領域をオーバーライドします。これはプログラムにとって問題になります。

char * askForBookID() { 
     //char id[6]; 
     char *id = malloc(sizeof(char)*6); 
     if(!id){ //check if malloc got some memory for id 
      printf("Sorry not enough memory"); return NULL; 

     } 

     printf("Tell me which book (ID)\n"); 
     scanf_s("%5s",id, 6); 

     return id; 
} 
+0

私はプラットフォーム上のcの実装に関して何も仮定していないので、私の答えは好きですが、おそらくこの答えはもっと役に立ちます。 upvoteをしてください。 – Bathsheba

+0

@Bathsheba私はあなたに同意します。 –

+0

ありがとうございました - 私はchangeStatusOfBook()でmallocを使用しようとしていましたが、askForBookID()について考えなかった理由は何もありません。 – MrKaszu

3

関数askForBookIDは、自動保存期間を持つ配列の最初の要素のアドレスを返します。

関数が呼び出されたときのポインタの動作は定義されていません。

代わりにmallocを使用してください。

関連する問題