C언어 코어 덤프가 나는 이유
-파일1
#include "Member.h"
#include
#include
#include
extern int count;
void createBankAccount(Member members[])
{
Member newMember;
printf("[계좌 개설]\n");
printf("Account id : ");
scanf("%s", newMember.bankNumber);
printf("User name : ");
scanf("%s", newMember.userName);
printf("input : ");
scanf("%d", &newMember.account);
//copy member info
strcpy(members[count].bankNumber, newMember.bankNumber);
strcpy(members[count].userName, newMember.userName);
members[count++].account = newMember.account;
//printf("success function\n");
}
void input(Member members[])
{
char bankNumber[15];
int inputMoney = 0;
printf("Account id : ");
scanf("%s", bankNumber);
printf("input : ");
scanf("%d", &inputMoney);
for(int i=0; i
{
if(strcmp(bankNumber, members[i].bankNumber) == 0)
{
members[i].account += inputMoney;
break;
}
}
}
void output(Member members[])
{
char bankNumber[15];
int outputMoney = 0;
printf("Account id : ");
scanf("%s", bankNumber);
printf("output : ");
scanf("%d", &outputMoney);
for(int i=0; i
{
if(strcmp(bankNumber, members[i].bankNumber) == 0)
{
members[i].account -= outputMoney;
break;
}
}
}
void printAllMemberInfo(Member members[])
{
for(int i=0; i
{
printf("Account id : %s\n", members[i].bankNumber);
printf("User name : %s\n", members[i].userName);
printf("Account : %d\n", members[i].account);
printf("\n");
}
}
-파일2
#include
#include
#include
#include "Member.h"
int count = 0;
int main(void)
{
short choice = 1;
Member * members = (Member *)malloc(sizeof(Member)*20);
//Member members[20];
while(choice != 5)
{
printf("----------MENU-----------\n");
printf("1. create an acoount\n");
printf("2. input money\n");
printf("3. output money\n");
printf("4. print all memebers info\n");
printf("5. terminate service\n");
printf("\nchoice : ");
scanf("%d", &choice);
switch(choice)
{
case 1:
createBankAccount(members);
break;
case 2:
input(members);
break;
case 3:
output(members);
break;
case 4:
printAllMemberInfo(members);
break;
case 5:
free(members);
printf("service terminate\n");
break;
}
}
}
struct 정의한 Member는 별거 없고 그냥 이름, 계좌번호, 금액 관련된 정보를 가지고 있습니다.
제가 이해가 안되는 부분은 createBankAccount함수를 호출해서 회원 수를 늘릴 때 core dumped가 되는 이유입니다.
메인함수에서 Member type인 자료형을 20개 동적 할당받아서 members가 가리키는데
이것을 함수의 인자로 전달해서 관리하는데 무엇이 문제인지 모르겠습니다.
Member * members = (Member *)malloc(sizeof(Member) * 20);
members[4].account = 10000; //access 당연히 가능!
이것을 함수로 전달하고자 하여
argument :: Member members[] or Member * members로 받는 것이 문제가 되나요?
소스코드는 code 태그 안에
소스코드는 code 태그 안에
Member 정의가 없으면 해석 불가
Member 정의가 없으면 해석 불가
설마 안에 char* bankNumber; 처럼 포인터만 있는건 아니겠죠?
그냥 소스코드 모두 올립니다.
헤더파일 부분 열어서 확인하시면 알겠지만 포인터로 선언하지 않았습니다.
short --> int
short --> int
왜 short가 안될까요? 메뉴 선택만 하는 거라서
왜 short가 안될까요? 메뉴 선택만 하는 거라서(사용자가 엄청 큰 숫자를 누르면 문제가 되겠지만) short로 한건데..
형식지정자를 이상하게 해서 그런 것 같습니다.
형식지정자를 이상하게 해서 그런 것 같습니다.
%u로 하니까 int로 type전환하지 않아도 잘 굴러가네요!
short 는 2바이트인데
short 는 2바이트인데
scanf 가 %d 포맷을 처리할 때는 주어진 주소에서 sizeof(int)=4 바이트만큼을 채워넣기 때문에 그렇습니다. 결과적으로 choice 변수의 범위를 벗어나서 뭔가를 쓰게 되고, 그 자리에 중요한 데이터가 들어있었다면(함수의 리턴 어드레스라든가...) 거기서 펑 터지는 거죠. 죽지 않더라도 다른 변수의 값을 변조해버려서 오동작하게 만들 수도 있을 거고요.
%u 를 하니까 괜찮았다고 하셨는데 %u 역시 unsigned int 를 처리하는 것이니 마찬가지로 4바이트를 씁니다. 그러니 잘 굴러갔다 해도 그것은 그저 운이 좋았을 뿐이고 항상 좋을 거라는 보장은 없습니다.
short 변수에 입력을 받고 싶으면 %hd 나 %hu 를 쓰세요.
좋은 하루 되세요!
한줄 씩 확인해보세요.
http://ideone.com/V8jehO
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기