2014-12-11 6 views
1

Я пытаюсь создать malloc на основе структуры.Комбинирование Struct + malloc в C

структура выглядит следующим образом:

struct shirts 
     { 
     char color[10]; 
     int size; 
     }; 

struct shirts* ptr_shirts; 

я тогда хочу сделать й количество футболок, так что у меня есть переменный для этого:

printf("How many T-shirts? "); 
      scanf("%d",&amount); 
      getchar(); 
      ptr_shirts = (struct shirts *)malloc(amount * sizeof(struct shirts)); 

я тогда хочу Fille пространства но я не знаю, как это сделать. Я пытался использовать цикл и поместить в значениях, как это массив:

for(i = 0; i<amount;i++) 
      { 
      printf("Color on T-shirt nr %d: ",(i+1)); 
      scanf_s("%s", "what to type here" ,sizeof(ptr_shirts->color)); 
      printf("Size on T-shirt nr %d: ",(i+1)); 
      scanf("%d",&"what to type here"); 
      } 

Я попытался с

ptr_shirts[i].size 
ptr_shirts->size[i] 
(ptr_shirts.size 
and then ptr_shirts++) 

, но я не знаю, как сделать это легко потому что я хочу, чтобы заполнить более 1 футболка, вот проблема я получил

+0

Вы можете использовать указатель, используя синтаксис массива индексации, поэтому 'ptr_shirts [я] .size' правильно, для значений of 'i' в диапазоне 0 <= i

+0

Обратите внимание, что вы должны передать указатель на член 'size', поэтому вам нужно разыменовать амперсанд (' & '). Но в случае члена 'color' массив' char' сразу распадается на указатель на первую ячейку. – bitmask

+1

О, и, кстати, [в C вы не должны бросать результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

ответ

1

для членов записки color массива, scanf_s функции нестандартная (ну, честно говоря, в кроме С11 с (необязательно, хотя) Приложением B, но это не очень хорошо -адаптировано еще), вы можете использовать fgets() вместе с stdin в качестве «более безопасной» альтернативы.

В случае size члена должно быть просто:

&ptr_shirts[i].size 

(то есть: scanf("%d", &ptr_shirts[i].size);)

или в качестве альтернативы:

&(ptr_shirts + i)->size 

Пара дополнительных примечаний:

  • Do I cast the result of malloc?
  • всегда проверять возвращаемое значение из malloc(), как это может быть NULL
-1
Try This - 
ptr_shirts = (struct shirts *)malloc(amount * sizeof(struct shirts)); 

for(i = 0; i<amount;i++) 
     { 
      memset (ptr_shirts[i],0,sizeof(struct shirts)); /*Assign structure variable to NULL*/ 
      printf("Color on T-shirt nr %d: ",(i+1)); 
      scanf_s("what to type here %s", ptr_shirts[i].color,_countof(ptr_shirts[i].color)); 
      printf("Size on T-shirt nr %d: ",(i+1)); 
      scanf_s("what to type here %d", ptr_shirts[i].size,_countof(ptr_shirts[i].size)); 
     }