프로그래밍 구조체 공부중인데 원인을 찾을수없는 에러로 고민하다 여쭤봅니다.

익명 사용자의 이미지

#include<stdio.h>
#include<stdlib.h>
 
typedef struct Food{
        char name[30];
        int price;
        int cal;
}food;
 
int main(){
 
        food *pt=malloc(sizeof(food)*3);
        int i;
        for(int i=0;i<3;i++){
 
        printf("input %dth food name: ",i+1);
        scanf("%s",pt[i].name);
        printf("input price: ");
        scanf("%d",&pt[i].price);
        printf("input calorie: ");
        scanf("%d",&pt[i].cal);
 
        }
 
        for(int j=0;j<3;j++){
 
                printf(" %s ",pt[i].name);
        }
        printf("\n");
        for(int p=0;p<3;p++){
 
                printf(" %d ",pt[i].price);
        }
        printf("\n");
        for(int p=0;p<3;p++){
 
                printf(" %d ",pt[i].cal);
        }
        printf("\n");
 
        free(pt);
}

위 코드가 제가 짜본 코드인데요, 도무지 이해 안되는 부분이 몇가지 있고 결정적으로 core dumped라는 에러가 나는데 이유를 모르겠습니다.

구조체 변수를 만들 때 포인터로 만들면 malloc으로 메모리 할당을 해줘야 하잖아요?

거기서 sizeof(struct)*n 으로 배정을 해서 n개 배열처럼 만들고 싶은데요

처음에 scanf에서 멤버 name의 값을 받을때 scanf("%s", (pt+i)->name)으로 썼거든요... 그런데 에러가 나더라구요

화살표를 아예 안쓰고 pt[i].name으로 하니까 이부분은 넘어가지던데 화살표를 쓰려면 어떻게 해야하는지 궁금해요

그 다음엔 i가 배정이 안되어있다고 또 에러가 뜨더라구요 분명 for문에서 i를 선언을 했는데도요.
그런데 아예 for문 밖에서 선언을 따로 해주니까 또 에러가 안나요;; 골때리는게 밑에 for문은 별 문제없이 넘어가지구요

마지막으로 실행을 하니까 실행이 되긴하는데 중간에 결과가 안나오고 segment error였나? core dumped 되었다고 하더라구요

이거 물어볼 사람도 없고 여기서 몇시간째 끙끙대다보니 돌아버릴 것 같습니다 ㅠㅠ 제발 알려주세요

라스코니의 이미지

debug를 해 보세요. 처음 scanf()를 돌리고 있는 for 루프를 라인 단위로 실행하다 보면 scanf() 후에 name, price, cal 등에 어떤 값이 들어가 있는지 확인해 보세요.
pt->name;
pt++;
pt->name;
pt++;
pt->name; 식으로 접근할 수 있습니다.

익명 사용자의 이미지

잘 돌아가는 프로그램과 그렇지 않은 프로그램은 겉보기에 상당히 비슷할 수 있습니다.
경우에 따라서는 단 몇 글자 차이일 뿐이기도 합니다. 심지어는 단 한 글자 차이일 때도 있고요.

하지만 그 한 글자가 정말 엄청난 차이를 불러오지요. 그러니 프로그래밍을 할 때에는 키보드 키 하나라도 심혈을 기울여 누르도록 합시다.

#include<stdio.h>
#include<stdlib.h>
 
typedef struct Food{
        char name[30];
        int price;
        int cal;
}food;
 
int main(){
 
        food *pt=malloc(sizeof(food)*3);
        int i; // main의 지역 변수 i가 정의됩니다. 편의상 이걸 i0이라고 부릅시다.
        for(int i=0;i<3;i++){ // for문 내부에서의 변수 i가 정의됩니다.
                // 이 i는 i0와는 다르며, for문 내부에서만 살아있습니다. i1이라고 부릅시다.
                // C언어는 이렇게 중첩된 서로 다른 범위에서 이름이 같은 지역변수를 정의하는
                // 것을 허용합니다.
 
        printf("input %dth food name: ",i+1); // 이 for문 안에서 i는 항상 i1을 가리킵니다.
        scanf("%s",pt[i].name);
        printf("input price: ");
        scanf("%d",&pt[i].price);
        printf("input calorie: ");
        scanf("%d",&pt[i].cal);
 
        }
 
        for(int j=0;j<3;j++){ // 루프 인덱스 변수 이름을 j로 선택하는군요. 왜 갑자기 바뀌었는지
                // "사람"은 의심스러워합니다. 컴파일러는 전혀 의문을 가지지 않습니다.
 
                printf(" %s ",pt[i].name); // "사람"은 왜 바로 전의 루프 인덱스 변수 j를 쓰지 않고
                // i를 썼는지 의심스러워하거나, 이 불일치를 전혀 눈치채지 못하고 넘어갑니다.
                // 컴파일러는, 여기서 보이는 i는 i0뿐이기 때문에 의심의 여지 없이 i0를 참조하는 것으로
                // 해석합니다.
                // 친절한 컴파일러는 i0이 단 한 번도 초기화된 적이 없기 때문에 런타임에 탈이 날 것을
                // 예측하고 경고해 줍니다. 사용자 옵션에 따라 에러가 발생할 수도 있습니다.
        }
        printf("\n");
        for(int p=0;p<3;p++){ // 루프 인덱스 변수 이름을 이번엔 p로 선택하는군요. "사람"은 더더욱 의심을
                // 품습니다. 컴파일러는 여전히 전혀 의문을 가지지 않습니다.
 
                printf(" %d ",pt[i].price); // 앞서와 같습니다.
        }
        printf("\n");
        for(int p=0;p<3;p++){ // 앞서와 같습니다.
 
                printf(" %d ",pt[i].cal); // 앞서와 같습니다.
        }
        printf("\n");
 
        free(pt);
}

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.