2013-06-11 7 views
2

Итак, я изучаю структуры и пытаюсь ввести строку с динамическим распределением памяти.Динамическое распределение и структуры памяти

Вот то, что я до сих пор:

typedef struct{ 
    char foo[81]; 
    } TYPE; 


void function(TYPE get[]){ 
    char a[81]; 
    scanf("%s", a); 

    get->foo = malloc(strlen(a)+1*sizeof(char)); //this line produces an error that it is not assignable 

    strcpy(get->foo,a); 

    return; 

} 

Я не уверен, что это неправильно с этим утверждением, что любая помощь будет хорошо оценена.

+0

Кстати, ваш аргумент 'malloc()' не имеет никакого смысла. Вы имеете в виду '(strlen (a) + 1) * sizeof (char)', но поскольку 'sizeof (char)' is * always * 1, это должно быть просто записано как 'strlen (a) + 1'. – unwind

ответ

8

foo является объектом массива, а не указатель, так что вы не можете использовать операцию

get->foo = (char*)calloc(strlen(a)+1,sizeof(char));

вы пытаетесь присвоить (void *) к типу char[81], который совершенно несовместим. Lvalue должен быть указателем в этом случае.

+1

Я думаю, что OP уже это заметил. Вопрос был «почему» ... – glglgl

+0

Perfect. -1 до +1 ... – glglgl

5

Вы должны объявить вас foo, чтобы быть указателем на символ.

typedef struct{ 
    char * foo; 
} TYPE; 
+0

Почему это не работает как массив? Для моего (ограниченного) понимания нотация указателя - это еще один способ записи массива – user2473477

+7

Нет, указатели и массивы не совпадают. –

+1

@ user2473477 [Read this.] (Http://c-faq.com/aryptr/aryptr2.html) –

4

Вы пытаетесь выделить память для foo и назначить ей адрес выделенной памяти. Это не сработает. foo - это массив и уже выделен для него память (81 char элементов.) И поскольку это массив, вы не можете назначить ему адрес.

Что вы хотите, чтобы скопировать a строку foo:

scanf("%s", a); 
strcpy(get->foo, a); 

Однако, вы можете сделать лучше, фактически ограничивая сканирование и копирование до 81 символов, так что вы не будете писать мимо конец foo ни a:

fgets(a, 81, stdin); 
strncpy(get->foo, a, 81); 

Consulting документацию для fgets() и strncpy() это хорошая идея (там вы можете выяснить, почему вы можете указать 81 вместо 80 в вызове fgets().) Вы всегда должны быть осторожны, чтобы не писать за конец массива.

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