2013-05-31 3 views
0

Программа сбой при назначении. Как я могу заставить его работать? Заранее спасибо. Извините, если это repost. Не удалось найти аналогичный пример в любом месте.C динамическое назначение структуры с объявлением указателя

#include <stdio.h> 

typedef struct _kv 
{ 
    char *key; 
    char *value; 
} _kv; 

typedef struct _kvs 
{ 
    _kv *kv; 
    int size; 
} _kvs; 

main() 
{ 
    _kvs a; 

    a.kv[0].key  = "This is key One"; 
    a.kv[0].value = "This is value One"; 

    a.size = 1; 

    printf("%s = %s\n", a.kv[0].key, a.kv[0].value); 
} 

ответ

1

Вы создали указатели, но не освободили место для памяти. Вам нужно связать некоторую память с указателями, возможно, используя malloc.

a.size = 1; 
a.kv = malloc (a.size * sizeof (_kv)); 
int i; 
const int string_sz = 80; // Or whatever else the string size should be 
for (i = 0; i < a.size; i++) 
{ 
    a.kv[i].key = malloc (string_sz); 
    a.kv[i].value = malloc (string_sz); 
} 

strcpy (a.kv[i].key, "This is key one"); 
strcpy (a.kv[i].value, "This is value one"); 
0

Неинициализированные указатели не могут быть отсрочены, вы должны сначала убедиться, что они указывают на действительную память.

_kvs a; 

a.kv = malloc(1 * sizeof *a.kv); /* Allocate a single _kv. */ 
a.kv[0].key = "key"; 
a.kv[0].value = "value"; 
a.size = 1; 

Или вы могли бы использовать память в стеке:

_kv my_kvs[1]; 
_kvs a; 

a.kv = my_kvs; 
a.kv[0].key = "key"; 
a.kv[0].value = "value"; 
a.size = 1; 
Смежные вопросы