구조체 포인터 질문인데
글쓴이: 바이러스 / 작성시간: 목, 2003/11/06 - 7:18오후
/********************구조체를 이용한 성적 프로그램************
학생수10명에 대한 국어,영어,수학 성적을 받는다
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _student{
char *name[10];
int *number[3];
}Student;
void main()
{
Student *pStu;
for(int i=0;i<10;i++)
{
pStu=(Student *)malloc(sizeof(Student));
pStu->name=(char *)malloc(sizeof(char));
pStu->number(int *)malloc(sizeof(int));
memeset(pStr->name,0,sizeof(char));
memeset(pStr->number,0,sizeof(int));
scanf("%s",&pStu->name);
for(int j=0;j<3;i++)
{
scanf("%d\",&pStu->number);
}
pStu++;
}
pStu=Student;
for(int i=0;i<10;i++)
{
printf("%s",pStu->name);
for(int j=0;j<3;i++)
{
printf("%s",pStu->number);
}
pStu++;
}
pStu=Student;
for(int i=0;i<10;i++)
{
free(pStu->number);
free(pStu->name);
free(pStu->pStr);
pStu++;
}
}아직 포인터 개념이 확실히 안서서 그런데 소스보시고 지적 바랍니다
좀더 간단히 하거나 빠진 부분있으면 체크해주세요
수고하세요
Forums:


[code:1]/********************구조체를 이용한
/********************구조체를 이용한 성적 프로그램************ 학생수10명에 대한 국어,영어,수학 성적을 받는다 **************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /* struct _student식으로 쓰실 계획이 없으시다면 이런식으로 하셔도 됩니다. */ typedef struct { /* 이부분 왜 포인터 배열을 쓰셨는지 잘 모르겠군요.. */ char *name[10]; int *number[3]; }Student; void main() { Student *pStu; for(int i=0;i<10;i++) { /* 10명의 자료를 받아야 하는데 이렇게 하면 한명분밖에 못받습니다.. sizeof(Student)*10 식으로 하시거나 배열로 하시는게 좋을 듯 싶습니다..*/ pStu=(Student *)malloc(sizeof(Student)); /* 여기서.. 1바이트를 할당했습니다.. */ pStu->name=(char *)malloc(sizeof(char)); pStu->number(int *)malloc(sizeof(int)); memeset(pStr->name,0,sizeof(char)); memeset(pStr->number,0,sizeof(int)); /* 여기서.. 두가지 문제가 있습니다.. * 1. pStu->name 자체로 메모리 주소값을 가지고 있는데.. * 다시 주소연산자를 사용했으므로.. pStu->name 의 주소값을가집니다 * 2. 위에 주석 달았듯이 1바이트를 할당했으므로 1번의 오류가 없더라도 * 무조건 버퍼오버플로우가 일어나게 됩니다.. "1"은 1바이트가 아닌 2바이트를 사용하거든요 */ scanf("%s",&pStu->name); /* 이런식으로 쓰실라면 구조체에서 *number[3]이 아닌 number[3]으로 * 선언하셨어야 합니다 또한 j값은 변화가 없으니 계속 값을 받겠군요.. * 무한룹에 덤으로 같은 메모리 공간에 값만 계속 바뀔 듯 합니다.. */ for(int j=0;j<3;i++) { /* 이것도 마찬가지구요 :) number[3]으로 선언하셔야 했을 듯 하네요.. 또한 이렇게 하면 같은 곳에 세번 값을 받겠군요.. */ scanf("%d\",&pStu->number); } pStu++; } /* 여기서부터 출력이군요.. Student는.. 자료형이지 변수가 아닙니다 위에서처럼 저렇게 pStu++를 사용하시고 싶으시면 pStu-=10; 식으로 하셨어야 합니다. */ pStu=Student; for(int i=0;i<10;i++) { printf("%s",pStu->name); for(int j=0;j<3;i++) { /* 같은 값 세번 출력하겠군요.. 또한 int j=0 이런식으로 for안에서 사용하는건 좋은 방법도 아니고 언제나 컴파일에 성공하는게 아닙니다.. gcc버젼에 따라 될때도 있고 안될때도 있을겁니다.. 덤으로 i++가 아니라 j++가 되야 맞았을 듯 합니다.. */ printf("%s",pStu->number); } pStu++; } /* 여기도 마찬가지로 문제네요 */ pStu=Student; for(int i=0;i<10;i++) { free(pStu->number); free(pStu->name); free(pStu->pStr); pStu++; } }돌아간다고 해도 버퍼오버플로우가 무조건 일어나고
세그폴트를 구경하실 수 있으실 듯 =3=33
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Re: 구조체 포인터 질문인데
개념이 좀 안 서신게 분명한듯 합니다.
먼저 구조체에서는
char *name[10];
int *number[3];
포인터의 배열이 되나요? 배열로 쓰시려고 선언한듯 한데... 구태여 앞에 *를 붙여서 강조(?)하실 필요는 없겠죠. 따라서 아래쪽에서도 메모리를 할당해(malloc)줄 필요가 없겠죠?
두번째로
Student *pStu;
for(int i=0;i<10;i++)
{
pStu++;
}
상당히 납득이 안가는 부분입니다. :) 저런식으로 코드를 작성하시면.. 음음! 할당되지 않은 영역을 엑세스 하는것이 되겠죠. 음.. pStu에 Strudent만큼의 메모리를 할당하였지만, 그 뒷부분까지 메모리를 할당해준것은 아니니까요. Linked list라던가 이부분에서 차라리 포인터 배열을 쓰심이.. ;; 어떨런지요.
------------------
나는 바보
[code:1]/********************구조체를 이용한
/********************구조체를 이용한 성적 프로그램************ 학생수10명에 대한 국어,영어,수학 성적을 받는다 **************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[10]; int number[3]; } Student; int main() { Student pStu[10]; int i, j; for( i = 0 ; i < 10 ; i++ ) { memeset( pStu[i].name, 0, sizeof(pStu[i].name) ); scanf( "%s", pStu[i].name); for( j = 0 ; j < 3 ; j++ ) scanf( " %d", &pStu[i].number[j] ); } for( i = 0 ; i < 10 ; i++ ) { printf( "%s", pStu[i].name ); for( j = 0 ; j < 3 ; j++ ) printf("%s",pStu[i].number[j]); } }정상적으로 돌아가게 하려면 이런식으로 하셔야 합니다..
고치면서 보니까.. 중간중간 무슨 생각으로 하셨는지 대강
이해할거 같긴 했는데..
테스트도 안해보신것과..-_-;;
잘못된 발상이 보이더군요..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
음 malloc할당한 이유는 동적으로 메모리 할당을 할려고 했습니다
음 malloc할당한 이유는 동적으로
메모리 할당을 할려고 했습니다
typedef struct {
char name[10];
int number[3];
} Student;
<==요부분은 제가 잘못적었군요 지적감사합니다
Student *pStu[10]; <==이런식으로
포인터를 잡으면 안되나요?
사람이 죽은뒤에 영혼이라는 것이 과연 존재 할까?죽음으로써 해답을 찾아보자...
[quote="sakai83"]음 malloc할당한 이유는 동적으로
------------------
나는 바보
댓글 달기