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 |
29 | 30 | 31 |
Tags
- BOJ
- 백준
- JavaScript
- dfs
- Algospot
- 정수론
- greedy
- C
- programmers
- sorting
- 따라하면서 배우는 C언어
- graph
- C언어
- Python
- Cleancode
- 생활코딩
- 종만북
- 따라하며 배우는 C언어
- BASIC
- BFS
- Algorithm
- server
- Math
- udemy
- php
- String
- 따배씨
- web
- DP
- 인프런
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;
}
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
'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