2017-03-15 9 views
-1

整数と文字列の2つのフィールドを持つ構造体のプログラムを記述する必要があります。次に、この構造体を動的に割り当てる関数を書く必要があります。intとstringをパラメータとして渡して、割り当てられた構造体に渡します。この関数は、新しく作られた構造体へのポインタも返します。このプログラムの第2の要素は、struct pointerをパラメータとしてとり、画面上のすべてのfiledsを出力し、次にstructのメモリを解放する関数でなければなりません。これは私が思いつくことができる最高です。構造体の動的メモリ割り当て

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

struct str{ 
    int num; 
    char text[20]; 
}; 

struct str* return_address(int *num, char *text){ 
    struct str* new_struct=malloc(sizeof(struct str)); 
    new_struct->num=num; 
    new_struct->text[20]=text; 
    return new_struct; 
}; 

void release(struct str* s_pointer){ 
    printf("%d %s", s_pointer->num, s_pointer->text); 
    free(s_pointer); 
}; 



int main() 
{ 
    struct str* variable=return_address(1234, "sample text"); 
    release(variable); 

    return 0; 
} 
+0

質問は何ですか? – sergej

+0

私はこのプログラムを動作させることができませんでした。コンパイルされてもクラッシュします。 –

+0

私は、 'new_struct-> text [20] = text;'はあなたが望むものではないと思います。 –

答えて

0
  1. あなたの配列はまた、それがすべてではないダイナミックだ、非常に小さいです。とにかくmalloc()を使用して割り当てている場合は、すべてを動的に割り当てる必要はありませんか?
  2. 配列に割り当てることはできません。
  3. 」の文字列「」の長さを格納すると考えられるnumのメンバーに、ポインタが割り当てられています。これは明らかに必要ではありません。また、振る舞いは非常に特別な状況でのみ定義されます。ポインタを整数に代入すると、警告をオフにしない限り、コンパイラは警告を発します。おそらく、あなたはこれをしたい

struct string { 
    char *data; 
    int length; 
}; 

struct string * 
allocate_string(int length, const char *const source) 
{ 
    struct string *string; 
    string = malloc(sizeof *string); 
    if (string == NULL) 
     return NULL; 
    string->length = strlen(source); 
    // Make an internal copy of the original 
    // input string 
    string->data = malloc(string->length + 1); 
    if (string->data == NULL) { 
     free(string); 
     return NULL; 
    } 
    // Finally copy the data 
    memcpy(string->data, source, string->length + 1); 
    return string; 
} 

void 
free_string(struct string *string) 
{ 
    if (string == NULL) 
     return; 
    free(string->data); 
    free(string); 
} 
関連する問題