전 강에서 배열 형태의 문자열에 사용자 입력값을 저장해보았다. 이번에는 문자열 포인터 안에 입력 값을 저장해보자.
문자열 포인터를 선언하고, scanf 함수로 문자열을 덮어쓰기 해주면 되지 않을까??
●오류 코드예제
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
char *s = "Hello"; // 문자열 포인터를 선언하고 문자열 할당
printf("문자열을 입력하세요: ");
scanf("%s", s); // 실행 에러
printf("%s\n", s);
return 0;
}
이런 식의 액세스 오류가 뜬다. 왜 이런 액세스가 뜰까? 결론부터 말하자면, s에 저장되는 메모리 주소는 쓰기가 아닌 읽기 전용이기 때문이다. scanf를 통해 덮어쓰기 하는 것은 쓰기이므로 안 되는 것이다.
그렇다면 어떻게 해야 할까?
읽기 전용이 아닌 메모리 자체를 할당해주면 되지 않을까? 바로 malloc 함수에서 그 해답을 찾을 수 있다!!
●코드 예제
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
char *s1 = malloc(sizeof(char) * 9); // char 9개 크기만큼 동적 메모리 할당
printf("문자열을 입력하세요: ");
scanf("%s", s1); // 표준 입력을 받아서 메모리가 할당된 문자열 포인터에 저장
//s1의 주소에 들어가 입력된 문자열을 저장해준다.
printf("%s\n", s1); // 문자열의 내용을 출력
free(s1); // 동적 메모리 해제
return 0;
}
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 25강-1) 문자열 비교하기 strcmp 함수 (0) | 2020.11.14 |
---|---|
C언어 25강) 문자열 길이 구하기 strlen함수 (0) | 2020.11.14 |
C언어 23강) 배열 형태의 문자열에 입력하기(scanf/char) (0) | 2020.11.13 |
C언어 22강) 동적메모리할당과 포인터변수를 통한 배열 (2) | 2020.11.12 |
C언어 21강) malloc함수로 메모리 사용하기 (0) | 2020.11.07 |