2016-11-20 3 views
0

Я пытаюсь поменять местами две структуры, которые динамически распределены. Но заменяется только строка (имя). Любой может сказать мне, что случилось с моим фрагментом.Перестановка динамических распределенных структур

typedef struct 
{ 
char name[20]; 
int num; 
char ch; 
}student; 

void swap(student **a,student **b) 
{ 
     student *temp; 
     temp = *a; 
     *a = *b; 
     *b = temp; 

} 

void main() 
{ 

     student *s; 
     int i; 
     s = (student *)malloc(10 * sizeof(student)); 

     printf("enter values: "); 

     for(i=0;i<10;i++) 
       scanf("%d %c %s",&s[i].num,&s[i].ch,s[i].name); 

     swap(s+3,s+4); 

     printf("\n"); 
     for(i=0;i<10;i++) 
       printf("%d %c %s\n",s[i].num,s[i].ch,s[i].name); 


     printf("\n"); 
} 

'

+0

Каждая структура не распределяется динамически независимо. Вы пытаетесь поменять местами две структуры, которые находятся в * динамически распределенной последовательности структур *. Вы не сделаете этого, заменив указатели. В этом есть только один изменяемый указатель: 's' в' main() '. – WhozCraig

+0

Потерять один уровень косвенности на * каждый * указатель в вашей 'swap' функции. Два параметра должны быть 'student *', а 'temp' не должен быть указателем. Остальное может оставаться неизменным. – WhozCraig

ответ

1

Функция swap() получает два параметра типа student **. Однако в вызове swap(s+3,s+4); вы передаете ему два аргумента типа student * - как есть тип s. Не могли бы вы скомпилировать его?

В любом случае, то, что вы делаете в функции swap(), заменяет содержимое, на которое указатель указывает. То есть, если у вас было два указателя на учеников (скажем: p1, который указывает ученику s1 и p2, который указывает на ученика s2), вы могли бы позвонить swap(&p1, &p2) и указать им других учеников (т. Е. p1-s2 и p2-s1).

Но в вашем коде main() вы не имеете указаний на student. Скорее, вы пытаетесь заменить содержание самих студентов - это совсем не то, что делает swap().

+0

скомпилирован и без ошибок. только имя заменяет структуру, а не целую структуру. Я попытался передать адреса swap (& s [3], & s [4]), но все же только имя заменяет не всю структуру – Nazeem

+0

Адреса swap будет работать только, если вы использовали указатели. Прочтите пересмотренный ответ. – Mike

0

Это erron, указатель относится к тому же месту памяти, Попробуйте использовать другой указатель ученика, например, объявите другого студента * s2 !!!