밑에 구조체 소스 수정판입니다(답변달아주셨던 분들도 보세요 ^
글쓴이: 바이러스 / 작성시간: 목, 2003/11/06 - 10:43오후
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _student{ char name[10]; int number[3]; }Student; void main() { int i,j; Student *pStu[10],*p; pStu=(Student *)malloc(sizeof(Student)*10); p=pStu; for(int i=0;i<10;i++) { pStu->name=(char *)malloc(80); pStu->number(int *)malloc(80); memeset(pStu->name,0,sizeof(pStu->name)); memeset(pStu->number,0,sizeof(pStu->number)); scanf("%s",&pStu[i]->name); for(j=0;j<3;j++) { scanf("%d\",&pStu[i]->number[j]); } p=p+1; } p=pStu; for(i=0;i<10;i++) { printf("%s",pStu[i]->name); for(j=0;j<3;j++) { printf("%s",pStu[j]->number); } p=p+1; } p=pStu; for(int i=0;i<10;i++) { free(pStu[i]->number); free(pStu[i]->name); p=p+1; } free(pStu); }
여기서
pStu->name=(char *)malloc(80); pStu->number(int *)malloc(80); memeset(pStu->name,0,sizeof(pStu->name)); memeset(pStu->number,0,sizeof(pStu->number));
그 malloc을 해준이유는 동적메모리 할당땜시 했구요
만약 pStu->name=(char *)malloc(80);해주면 80바이트를 쓸수있다는 말입니까 그리고 sizeof(pStu->name)이게 정형화된 memeset인지 궁금하군요
다시 부족하거나 지적사항을 알려주시면 감사하겠습니다
Forums:
char name[10]; int number[3]; -&g
char name[10];
int number[3];
-> char* name;
int * number;
로 바뀌어야 됩니다.
Student *pStu[10],*p;
pStu=(Student *)malloc(sizeof(Student)*10);
의도한 방향으로 메모리가 할달 되지 않습니다.
메모리그림을 그려가면서 보면 이해가 되실겁니다.
pStu[i] = (Student*)malloc(sizeof(Student));
이걸 열번 돌리세요.
맞습니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
Re: 밑에 구조체 소스 수정판입니다(답변달아주셨던 분들도 보세
sizeof(pStu->name) 이라고 하면 4가 나올겁니다
name[10]이니까 name은 상수포인터가 되니까요 :) sizeof(char)*10 이 되어야 맞을겁니다..
뭐 사실 pStu->name[0] = '\0';
만 해줘도 잘 돌기는 하니까 별 문제는 없겠네요...
p = p+1;
이나
p=pStu;
같은건.. 저런식으로 pStu[i]같이 접근할 경우엔 구지 사용할 필요가 없습니다..
그리고 pStu[i]식으로 하실려면 -> 가 아니라 . 으로 접근하셔야 합니다..
->는.. (*pStu).number 같은식으로 쓰게 되면 우선순위때문에
가로를 안치거나 하면 좀 헷갈리는 경우도 있고 문제가 생기는 경우도 있기 때문에
그런걸 피하기위해서 사용하는 겁니다..
(*pStu).number 나.. pStu->number는 같은 역할이죠..
그 포인터가 가리키는 곳에 있는 멤버를 뜻하는 말입니다..
scanf("%s",&pStu[i]->name);
흠 이부분에서도 같은 문제가 있고.. &는 사용하지 않아야 합니다..
저렇게 하면 name이라는 포인터의 주소를 넘겨주게 되서.. 버퍼오버플로우가 날 수도 있고 원하는데로 동작하지 않습니다..
저렇게 주소연산자를 구지 사용하고 싶으시다면
scanf("%s",&pStu[i].name[0]); 이 되어야 하고 이건..
scanf("%s",pStu[i].name); 이것과 결과적으로 같은 역할을 합니다..
memset하실때는.. []를 사용하지 않았고.. 또한 pStu는 변화되지
않고 있으므로 계속 같은곳만 초기화하고 있겠군요 저렇게 사용하는 건 맞습니다만..
그 문제는.. p를 증가시키는게 아니라
pStu를 증가시키고..
p=pStu; 가 아니라 pStu=p; 식으로 하시면 해결되는 문젭니다..
컴파일을 한번쯤 해보시고 올리시는게 좋을거 같군요..
적어도 어느정도나 원하는데로 동작하는지..
에러가 어떻게 나는지 ..
워닝이 어떻게 나는지가 익숙해지시는게 앞으로 편하실테니까요..
사실 성의 없어보입니다.. -_-;;
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
ddd를 써 보시는게 좋을듯 합니다.뭐.. gdb 자체에 익숙해
ddd를 써 보시는게 좋을듯 합니다.
뭐.. gdb 자체에 익숙해 지시는게 더 좋을지도 모르겠습니다만. ^ ^
------------------
나는 바보
댓글 달기