몽상실현개발주의

[따배씨] 14.9 구조체와 할당 메모리 본문

Language/C

[따배씨] 14.9 구조체와 할당 메모리

migrationArc 2021. 6. 26. 17:59

[따배씨] 14.9 구조체와 할당 메모리

따배씨 - 따라하며 배우는 C언어

14강 구조체_1

14.9 구조체와 할당 메모리

#include <stdio.h>
#include <string.h> // strlen(), strcmp()

#define SLEN 81

struct namect
{
    char* fname;    // Use malloc()
    char* lname;    // Use malloc()
    int letters;
};


int main()
{
    struct namect p = {"Jeong-Mo", "Hong"};
    printf("%s %s\n", p.fname, p.lname);
  
    /*
        Dangerous usage
     */

    int f1 = scanf("%[^\n]%*c", p.lname);
    printf("%s %s\n", p.lname, p.fname);
	
		return 0;
}
struct namect p = {"Jeong-Mo", "Hong"};
  • 포인터로 선언되었기 때문에, 문자열의 첫 주소가 저장됨
    • 문자열은 read only 인 text segment 메모리에 존재 하고, 문자열의 첫 주소값이 p.fname 과 p.lname 에 저장
int f1 = scanf("%[^\n]%*c", p.lname);
  • text segement 저장되어 있는 값을 수정하려고 할 시, EXC_BAD_ACCES Error 발생

 

 

 

#include <stdio.h>
#include <string.h> // strlen(), strcmp()
#include <stdlib.h> // malloc(), free()

#define SLEN 81

struct namect
{
    char* fname;    // Use malloc()
    char* lname;    // Use malloc()
    int letters;
};

int main()
{
	  struct namect p = {"Jeong-Mo", "Hong"};
    printf("%s %s\n", p.fname, p.lname);
  
    /*
        Recommended usage
     */
    
    char buffer[SLEN] = {0, };
    // 입력 값 임시 저장소
    
    int f2 = scanf("%[^\n]%*c", buffer);
    // 입력 받아서, buffer 에 저장
    
    p.fname = (char*)malloc(strlen(buffer) + 1);
    // 입력 받은 문자열을 저장할 공간을 동적 할당 받음
    
    if (p.fname != NULL)
        strcpy(p.fname, buffer);
        // buffer 에 내용을 p.fname 에 복사
        // p.fname = buffer 으로 입력 시, 주소값이 전달 됨
    
    printf("%s %s\n", p.fname, p.lname);
char buffer[SLEN] = {0, };
int f2 = scanf("%[^\n]%*c", buffer);
  • buffer : 입력 값 임시 저장소
p.fname = (char*)malloc(strlen(buffer) + 1);
  • 새롭게 입력받은 문자열을 저장하는 공간을 동적 할당 받음
strcpy(p.fname, buffer);
  • buffer 로 입력받은 문자열을 p.fname 에 복사
    • p.fname = buffer;
    • 주소값이 전달 되므로, strcpy() 를 사용하여 문자열 내용을 복사

 

 

 

#include <stdio.h>
#include <string.h> // strlen(), strcmp()
#include <stdlib.h> // malloc(), free()

#define SLEN 81

struct namect
{
    char* fname;    // Use malloc()
    char* lname;    // Use malloc()
    int letters;
};

void getinfo(struct namect*);           // allocate memory
void makeinfo(struct namect*);
void showinfo(const struct namect*);
void cleanup(struct namect*);           // free memory when done
char* s_gets(char* st, int n);

int main()
{
    struct namect person;
    
    getinfo(&person);
    makeinfo(&person);
    showinfo(&person);
    cleanup(&person);
    
    return 0;
}


void getinfo(struct namect* pst)
{
    int flag;
    char temp[SLEN] = {0, };
    
    printf("Please enter your first name.\n");
    
    flag = scanf("%[^\n]%*c", temp);
    if (flag != 1)
        printf("Wrong input");
    else
    {
        pst->fname = (char*)malloc(strlen(temp)+1); // + 1 is for '\0'
        if (pst->fname != NULL)
            strcpy(pst->fname, temp);
        else
            printf("Malloc() failed");
    }
    
    printf("Please enter your last name.\n");
    
    flag = scanf("%[^\n]%*c", temp);
    if (flag != 1)
        printf("Wrong input");
    else
    {
        pst->lname = (char*)malloc(strlen(temp)+1); // + 1 is for '\0'
        if (pst->lname != NULL)
            strcpy(pst->lname, temp);
        else
            printf("Malloc() failed");
    }
}

void cleanup(struct namect* pst)
{
    free(pst->fname);
    free(pst->lname);
}

void makeinfo(struct namect* pst)
{
    pst->letters = (int)(strlen(pst->fname) + strlen(pst->lname));
}

void showinfo(const struct namect* pst)
{
    printf("%s %s, your name contains %d letters.\n", pst->fname, pst->lname, pst->letters);
}

char* s_gets(char* st, int n)
{
    char* ret_val;
    char* find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');
        if (find)
            * find = '\0';
        else
            while (getchar() != '\n')
                continue;
    }
    
    return ret_val;
}

 

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

Comments