2016-04-07 15 views
0

このコードは、より大きなプログラムの一部です。私は構造体の配列を作成したいと思います。構造体には、charchar*という2つのデータ型があり、それぞれがユーザーからの入力を受け取ります。私はルーキーで、これで私の道を見つけることができません。助けてください。文字列を構造体に格納できません

エラーが発生:セグメンテーションフォールト11.

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

typedef struct { 
    char ch; 
    char str[20]; 
}typ; 

typ* add(char* str, char ch); 

int main(int argc, char const *argv[]){ 
    typ* arr; 
    arr = (typ*)malloc(sizeof(typ)); 

    char* name; 

    name = (char*)malloc(10); 
    *(name + 0)= 'c'; 
    *(name + 1)= 'a'; 
    *(name + 2)= 'p'; 
    *(name + 3)= '\0'; 
    char c = 'k'; 

    arr = add(name, c); 

    printf("%c\n", arr->ch); 
    printf("%s\n", arr->str); 

    return 0; 
} 

typ* add(char* str, char ch){ 
    typ tempo; 
    strcpy(str, tempo.str); 
    printf("%s\n", str); 
    tempo.ch = ch; 
    typ* temp; 
    *temp = tempo; 
    return temp; 
} 
+0

OK、新人を。最初のステップ - あなたがコードを読みやすくするためにインデントします。そうでなければdevsです。次の質問に進むだけです。 –

+0

第2ステップ - プログラムをデバッガで実行します。 –

+1

構造体型 'typ'の命名は役に立ちません:( –

答えて

2
  1. あなたが割り当てられたメモリのためのARRを使用したが、その後、あなたはのに戻り値を追加するには、それを割り当て、メモリがこの時点で失われてしまった、あなたが持っていますメモリーリーク。

  2. 追加機能では、関数が返された後に存在しない自動記憶域を持つ変数へのポインタを返します。だからこそ、あなたはセグメンテーションを取得しています。

だから私は、add関数に構造体を割り当て、それを返します:

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

typedef struct { 
    char ch; 
    char str[20]; 
} Item; 

Item* add(char* str, char ch); 

int main(int argc, char const *argv[]){ 
    int i; 
    int n = 3; // number of elements in the array 
    Item** arr = malloc(n * sizeof(Item*)); 

    arr[0] = add("cap", 'k'); 
    arr[1] = add("foo", 'i'); 
    arr[2] = add("bar", 'j'); 

    printf("%c\n", arr[0]->ch); 
    printf("%s\n", arr[0]->str); 

    for (i = 0; i < n; i++) 
     free(arr[i]); 
    free(arr); 
    return 0; 
} 

Item* add(char* str, char ch) { 
    Item *i = malloc(sizeof *i); 
    strcpy(i->str, str); 
    i->ch = ch; 
    return i; 
} 
+0

'main'の前に' free(arr); 'を実行するのがよい練習 – yano

+0

ありがとう、固定、ありがとう。 – fluter

+0

ありがとう@fluterしかし、それは私が 'arr'にメモリを割り当ててもうまく動作します。私がしなければならない唯一の変更は、' arr [0] = add(name、c); '' – hotessy

関連する問題