2016-11-20 4 views
0

동적으로 할당 된 두 구조를 교체하려고합니다. 그러나 string (name) 만 스와핑합니다. 누구나 내 스 니펫에 무엇이 잘못되었는지 말할 수 있습니다.동적 할당 구조 스와핑

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

각 구조는 독립적으로 동적으로 할당되지 않습니다. 동적으로 할당 된 구조의 단일 시퀀스에있는 두 개의 구조를 교체하려고합니다. 당신은 포인터를 교환함으로써 그렇게하지 않을 것입니다. 이것에는 오직 하나의 변경 가능한 포인터 만있다 :'main()'의's'. – WhozCraig

+0

'swap' 함수의 모든 * 포인터에 대해 한 레벨의 간접 참조를 잃습니다. 두 매개 변수는'student *'이어야하고'temp'는 포인터가 아니어야합니다. 나머지는 동일하게 유지 될 수 있습니다. – WhozCraig

답변

1

함수 swap()student ** 유형의 두 개의 매개 변수를 얻는다. 그러나 swap(s+3,s+4);이라는 호출에서 s 유형과 마찬가지로 student * 유형의 두 개의 인수를 전달합니다. 전혀 컴파일 할 수 있습니까?

어쨌든 swap() 함수에서 수행하는 작업은 각 포인터가 인 의 내용을 대체합니다. 즉, 학생들에게 두 개의 포인터가 있다면 (예 : p1, 학생 s1을 가리키고 p2는 학생 s2를 가리킴), swap(&p1, &p2)을 호출하여 다른 학생을 가리 키도록 할 수 있습니다 (예 : p1 ~ s2 및 p2 ~ s1).

그러나 main()의 코드에서는 student에 대한 포인터를 다루지 않습니다. 오히려, 당신은 학생들 자신의 내용을 대체하려고 노력합니다. 이것은 swap()이 전혀하지 않는 것입니다.

+0

이 컴파일되고 오류가 없습니다. 이름 만이 전체 구조 대신 구조간에 교체됩니다. 주소 스왑 (& s [3], & s [4])을 전달하려고 시도했지만 이름 만이 전체 구조를 스왑하지 않습니다. – Nazeem

+0

주소 스왑은 포인터를 사용하는 경우에만 작동합니다. 수정 된 답변을 읽어보십시오. – Mike

0

에르 론, 포인터가 동일한 메모리 위치를 나타냅니다. 다른 학생 포인터를 사용하십시오. 예를 들어 다른 학생을 선언하십시오 * s2 !!!