Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 인프런
- web
- greedy
- 종만북
- 따배씨
- php
- 따라하며 배우는 C언어
- BFS
- udemy
- dfs
- graph
- Algorithm
- JavaScript
- C
- BOJ
- 정수론
- 따라하면서 배우는 C언어
- C언어
- DP
- 생활코딩
- Cleancode
- Python
- Math
- server
- BASIC
- programmers
- sorting
- String
- Algospot
- 백준
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 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
'Language > C' 카테고리의 다른 글
[따배씨] 14.11 신축성 있는 배열 멤버 (0) | 2021.06.28 |
---|---|
[따배씨] 14.10 복합 리터럴 (0) | 2021.06.26 |
[따배씨] 14.8 구조체와 함수 연습문제 (0) | 2021.06.22 |
[따배씨] 14.4 구조체의 배열 연습 문제 (0) | 2021.06.22 |
[따배씨] 14.4 구조체의 메모리 할당 (0) | 2021.06.22 |
Comments