[기초] C언어 구조체 포인터 관련해서 질문 드립니다.
조회수 803회
#include <stdio.h>
#include <malloc.h>
typedef struct Point2D
{
int inint;
char inchar[10];
};
void structinput(struct Point2D *p, int su) {
int count = 1;
for (int i = 0; i < su; i++)
{
printf("%d 번째 구조체 정수 입력 : ", count);
scanf_s("%d", &p[i].inint);
printf("%d 번째 구조체 문자열 입력 : ", count);
scanf_s("%c", &p[i].inchar, sizeof(p[i].inchar));
count++;
//st[i].total = st[i].kor;
}
}
void structprint(struct Point2D *p, int su) {
int count = 1;
printf("--------- 구조체 결과 --------- \n");
for (int i = 0; i < su; i++)
{
printf("%d 번째 구조체 : %d,\t%s\n", count, p[i].inint, p[i].inchar);
count++;
}
return 0;
}
int main(void) {
int su;
printf("구조체 수 입력 :");
scanf_s("%d", &su);
struct Point2D *p /*= { 0 }*/;
p = (struct Point2D *)malloc(sizeof(struct Point2D)*su);
structinput(&p, su);
structprint(&p, su);
}
구조체를 몇 개 생성할지 입력받아 생성하고 그 안에 갚을 함수로 보내 입력한 뒤, 함수로 출력을 해보고 싶었습니다.
포인터 관련하여서 입력부터 corruption이 발생하는데, 이유를 알지 못하겠어서 질문 드립니다.
감사합니다. ;
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
체크해야 할 것이 많네요...최대한 쉽게 적어보면...
일단 char 배열을 미리 선언했다면 strcpy 류의 함수로 복사해서 넣는 형태로 해야 합니다.
포인터 연산을 학습중인지는 모르겠지만 우선
(p + 1)->inint
와 같이해서 이해하세요.structinput(&p, su); 가 아니라 structinput(p, su); 가 되어야 합니다.
https://wandbox.org/
상기 사이트에 접속하여 아래 코드로 테스트해보세요.
#include <stdio.h> #include <malloc.h> struct Point2D { int inint; //char inchar[10]; }; void structinput(struct Point2D *p, int su) { int count = 1; for (int i = 0; i < su; i++){ printf("%d 번째 구조체 정수 입력 : ", count); //scanf_s("%d", &p[i].inint); (p + i + 1)->inint = count; count++; //st[i].total = st[i].kor; } } int main() { int su = 5; struct Point2D *p /*= { 0 }*/; p = (struct Point2D *)malloc(sizeof(struct Point2D)*su); structinput(p, su); printf("%d\n", (p + 1)->inint); printf("%d\n", (p + 2)->inint); printf("%d\n", (p + 3)->inint); printf("%d\n", (p + 4)->inint); printf("%d\n", (p + 5)->inint); }
-
main 문에서 변수 선언은 가장 위에서 모두 해 주는것이 좋습니다.
malloc 을 이용해 메모리를 할당하였으면 free 를 이용해 해제도 해주서야 합니다.
그리고 structinput 함수에서 struct Point2D *p (포인터)를 인자로 받는데,
structinput(&p, su); 를 보면, 포인터의 주소를 전달하고 있네요.
아마 거기서 오류가 발생하지 않을까 싶습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력