2016-04-07 7 views
0

Этот код является частью более крупной программы. Я хочу создать массив структур. Структура содержит два типа данных: char и char*, каждый из которых получает вход от пользователя. Я новичок и не в состоянии найти свой путь через это. Пожалуйста помоги.Невозможно сохранить строку в структуре

Ошибка генерируется: сегментация Fault 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, новобранец. 1-й шаг - отступ, который вы кодируете, чтобы сделать его читаемым, иначе devs. просто перейдем к следующему вопросу. –

+0

2-й шаг - запустить вашу программу под отладчиком. –

+1

Именование типа типа 'typ' не помогает :( –

ответ

2
  1. Вы использовали обр для выделенной памяти, а затем присвоить его добавить Возвратимся значение, память заблудился в этот момент, у вас есть утечка памяти.

  2. В функции добавления вы возвращаете указатель на переменную с автоматическим хранилищем, которая не существует после возвращения функции. Вот почему вы получаете segfault.

Так что я бы выделить структуры в функции добавления, и возвращает его:

#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

хорошая практика для 'free (arr);' перед 'main' возвращает – yano

+0

да, исправлено, спасибо. – fluter

+0

Спасибо @fluter Но он отлично работает, даже когда я выделяю память 'arr'. Единственное изменение, которое я должен сделать, это' arr [0] = add (name, c); '. – hotessy

Смежные вопросы