C언어 코어 덤프가 나는 이유

alfhd00의 이미지

-파일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 태그 안에

Anti-Lock의 이미지

Member 정의가 없으면 해석 불가

설마 안에 char* bankNumber; 처럼 포인터만 있는건 아니겠죠?

alfhd00의 이미지

헤더파일 부분 열어서 확인하시면 알겠지만 포인터로 선언하지 않았습니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon BankAccount.zip1.33 KB
익명 사용자의 이미지

short --> int

익명 사용자의 이미지

왜 short가 안될까요? 메뉴 선택만 하는 거라서(사용자가 엄청 큰 숫자를 누르면 문제가 되겠지만) short로 한건데..

익명 사용자의 이미지

형식지정자를 이상하게 해서 그런 것 같습니다.
%u로 하니까 int로 type전환하지 않아도 잘 굴러가네요!

raymundo의 이미지

short 는 2바이트인데
scanf 가 %d 포맷을 처리할 때는 주어진 주소에서 sizeof(int)=4 바이트만큼을 채워넣기 때문에 그렇습니다. 결과적으로 choice 변수의 범위를 벗어나서 뭔가를 쓰게 되고, 그 자리에 중요한 데이터가 들어있었다면(함수의 리턴 어드레스라든가...) 거기서 펑 터지는 거죠. 죽지 않더라도 다른 변수의 값을 변조해버려서 오동작하게 만들 수도 있을 거고요.

%u 를 하니까 괜찮았다고 하셨는데 %u 역시 unsigned int 를 처리하는 것이니 마찬가지로 4바이트를 씁니다. 그러니 잘 굴러갔다 해도 그것은 그저 운이 좋았을 뿐이고 항상 좋을 거라는 보장은 없습니다.

short 변수에 입력을 받고 싶으면 %hd 나 %hu 를 쓰세요.

좋은 하루 되세요!

shint의 이미지

http://ideone.com/V8jehO

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000
 
int count = 0;
 
typedef struct DF_Member
{
    char bankNumber[20];
    char userName[20];
    int account;
}Member;
 
void createBankAccount(Member members[])
{
    Member newMember;
    printf("[계좌 개설]\n");
 
    printf("Account id : ");
//    scanf("%s", newMember.bankNumber);
    strcpy(newMember.bankNumber, "1234");
    printf("%s\n", newMember.bankNumber);
 
    printf("User name : ");
//    scanf("%s", newMember.userName);
    strcpy(newMember.userName, "user");
    printf("%s\n", newMember.userName);
 
    printf("input : ");
//    scanf("%d", &newMember.account);
    newMember.account = 10;
    printf("%d\n", newMember.account);
 
    //copy member info
    strcpy(members[count].bankNumber, newMember.bankNumber);
    strcpy(members[count].userName, newMember.userName);
    members[count++].account = newMember.account;
 
    printf("%s\n", members[0].bankNumber);
    printf("%s\n", members[0].userName);
    printf("%d\n", members[0].account);
//    printf("success function\n");
}
 
 
void input(Member members[])
{
    char bankNumber[15];
    int inputMoney = 0;
    printf("Account id : ");
//    scanf("%s", bankNumber);
    strcpy(bankNumber, "4321");
    printf("input : ");
//    scanf("%d", &inputMoney);
    inputMoney = 20;
 
    for(int i=0; i<15; i++)
    {
        if(strcmp(bankNumber, members[i].bankNumber) == 0)
        {
            members[i].account += inputMoney;
printf("bankNumber, members[i].bankNumber : %d\n", members[i].account);
            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<15; i++)
    {
        if(strcmp(bankNumber, members[i].bankNumber) == 0)
        {
            members[i].account -= outputMoney;
            break;
        }
    }
}
 
 
 
void printAllMemberInfo(Member members[])
{
    for(int i=0; i<15; 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");
    }
}
 
 
 
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);
choice = 1;
        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;
        default: break;
        }
choice = 2;
        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;
        default: break;
        }
choice = 3;
        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;
        default: break;
        }
choice = 4;
        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;
        default: break;
        }
choice = 5;
        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;
        default: break;
        }
    break;
    }
    return 0;
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.