2017-12-17 2 views
-1

이 코드는 struct Student 배열을 받아 들인 다음 포인터를 사용하여이를 표시합니다. 코드는 그리 일반적인 방법이 아닙니다. 일반적인 접근 방식은이 코드 자체 내에서 한 줄 주석으로 표시됩니다."포인터를 사용하여 구조체 배열에 액세스"

그러나 "백분율"의 올바른 값이 표시되지 않기 때문에이 접근 방식에 문제가있는 것 같습니다. 누구든지이 문제의 원인이 무엇인지 말해 줄 수 있습니까?

#include<stdio.h> 

struct Student 
{ 
    char grade; 
    int rollNumber; 
    float percentage; 
}; 

typedef struct Student Student; 

void acceptArray(Student*); 
void displayArray(Student*); 

int main() 
{ 
    Student myFriends[3]; 
    Student* p = myFriends; 

    acceptArray(p); 
    displayArray(p); 
} 

void acceptArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 
     printf("\nEnter grade, roll number, and percentage:\n"); 
     scanf(" %c %d %f", 
       (p + i), 
       //&(p + i)->grade 
       //&p[i].grade 
       ((Student*)((unsigned int)p + sizeof(char)) + i), 
       //&(p + i)->rollNumber 
       //&p[i].rollNumber 
       ((Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i) 
       //&(p + i)->percentage 
       //&p[i].percentage 
       ); 
    } 
} 

void displayArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 
     printf("\nGrade is  : %c.", *(p + i)); 
       //(p + i)->grade 
       //p[i].grade 
     printf("\nRoll number is: %d.", *((Student*)((unsigned int)p + sizeof(char)) + i)); 
       //(p + i)->rollNumber 
       //p[i].rollNumber 
     printf("\nPercentage is : %.1f.", *((Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i)); 
       //(p + i)->percentage 
       //p[i].percentage 
    } 
} 
+0

@ sg7 - 응? 'p'는'myFriends'의 첫 번째 요소를 가리 키도록 초기화됩니다. –

+0

@ sg7 typedef는 struct Student를 Student로 바꾸는 데 사용됩니다. –

+0

이것은 불분명합니다 - 전통적인'& p [i] .grade' 등을 사용할 때의 문제점은 무엇입니까? (최소 테스트 케이스 (https://stackoverflow.com/help/mcve)를 만들 수 있습니까?) –

답변

0

. 당신이 한 방식은 잘못되었습니다. 왜냐하면 (C에서 발췌 참조 매뉴얼 책) 그것은 옳지 않을 것이다. 메모리 구성 요소의 적절한 정렬을 허용 에 필요

구멍 또는 패딩 구조의 레이아웃의 마지막 요소 이후에 임의의 두 개의 연속적인 요소 또는 사이에 나타날 수있다. 이러한 구멍에 나타나는 비트 패턴 은 예측할 수 없으며 단일 구조 내에서 구조와 구조 또는 시간이 다를 수 있습니다.

항상 청결하고 읽기 쉽고 우리가 일반적으로하는 방식으로 구조체를 더 쉽게 읽을 수 있다고합니다 (&p[i].grade ..). 간단한 것을 단순하게 유지하십시오.

0

포인터를 올바르게 사용하고 있지 않습니다. 가장 좋은 방법은 [i]로 색인을 생성하고 . 연산자를 통해 구조체 멤버에 액세스하는 것입니다.

그런 식으로하면 더 깨끗한 코드를 얻을 수 있습니다. 구조 안쪽으로 들어가는 것은 구멍을 채우기 때문에 권장하지 않습니다.

#include<stdio.h> 

struct Student 
{ 
    char grade; 
    int rollNumber; 
    float percentage; 
}; 

typedef struct Student Student; 

void acceptArray(Student*); 
void displayArray(Student*); 

int main() 
{ 
    Student myFriends[3]; 
    Student* p = myFriends; 

    acceptArray(p); 
    displayArray(p); 
} 

void acceptArray(Student* p) 
{ 
    int i = 0; 
    char c; 
    int d; 
    float f; 

    for(i = 0; i < 3; i++) 
    { 
     printf("\nEnter grade, roll number, and percentage:\n"); 
     scanf(" %c %d %f", &c, &d, &f); 

       p[i].grade = c; 
       p[i].rollNumber = d; 
       p[i].percentage = f; 
    } 
} 

void displayArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 

     printf("\nGrade is  : %c.", p[i].grade); 
     printf("\nRoll number is: %d.", p[i].rollNumber); 
     printf("\nPercentage is : %.1f.", p[i].percentage); 
     } 
} 

OUTPUT : 당신은 scanf에 구조체 객체의 개별 구성 요소의 주소를 전달하려고하는

Enter grade, roll number, and percentage:                                                   
A 1 66.8                                                           

Enter grade, roll number, and percentage:                                                   
B 2 77.8                                                           

Enter grade, roll number, and percentage:                                                   
C 3 88.9                                                           

Grade is  : A.                                                        
Roll number is: 1.                                                        
Percentage is : 66.8.                                                        
Grade is  : B.                                                        
Roll number is: 2.                                                        
Percentage is : 77.8.                                                        
Grade is  : C.                                                        
Roll number is: 3.                                                        
Percentage is : 88.9.                                                        
관련 문제