C언어 - 문자열 변경, 문자열 상수와 포인터

2022. 8. 9. 00:05·C프로그래밍/개인 공부

문자열 변경하고 싶을때.

strcpy()를 사용한다. 헤더함수에 string.h를 포함시켜야한다.

1
2
3
4
5
6
7
8
#include<stdio.h>
#include<string.h>
 
int main(void)
{
    char str[10] = "Hi";
    strcpy(str, "bye");
}
cs

문자배열 str에 저장되어있는 Hi가 strcpy에 의해 bye로 바뀐다.(str문자배열로 복사)

주의!! 이렇게 하면 안됨.

1
2
3
4
5
6
7
8
#include<stdio.h>
#include<string.h>
 
int main(void)
{
    char str[10] = "Hi";
    str = "bye"; //이렇게 하면 안됨!
}
cs

 

얼핏보면 될 것 같지만,

배열의 이름은 배열이 저장되어있는 메모리의 주소이다. 

위에 처럼 하면, 주소에 bye문자열을 넣는 것과 같기때문에 안됨.


문자열 상수와 포인터

문자열 상수는 텍스트 세그먼트라는 메모리 영역에 저장되며 변경 불가능하다.(텍스트 세그먼트는 읽기만 가능하다! )

데이터 변수는 데이터 세그먼트라는 메모리 영역에 저장되며 변경 가능하다.

 

1
char *p = "hello world";
cs

이것은 가능하다. "hello world"문자열의 메모리상 주소를 포인터 변수p에 저장한다. 여기서 포인터변수 p는 데이터 세그먼트 영역에 저장된다.

 

1
2
char *p = "hello world";
strcpy(p, hi program); //문자열 상수를 변경하려고함!
cs

strcpy()함수로 문자열 상수를 변경하려고했다. 하지만 문자열 상수는 '텍스트 세그먼트'에 저장되기 때문에 변경이 불가능하다.

 

1
2
char *p = "hello world";
p = "hi programming"; //이것은 가능하다.
cs

이 예시는 가능하다. 문자열 상수를 변경하는대신, 포인터변수 p가 다른 곳을 가르키만들면 된다.

그러면, 처음에 포인터 변수p는 "hello world"라는 문자열 상수의 메모리상 주소를 가르키고있다가, "hi programming"문자열 상수의 메모리상 주소를 가르키도록 바꿔주면 된다.

 

'C프로그래밍 > 개인 공부' 카테고리의 다른 글

C언어 - 10진수를 2진수로 바꾸기(재귀함수)  (1) 2022.10.13
C언어 - 구조체와 포인터  (0) 2022.08.09
C언어 - 간접 참조 연산자 *  (0) 2022.07.14
C언어 - 쉽게 풀어쓴 C언어 express 10장 배열 실습문제(짝수번)  (0) 2022.07.13
C언어 - 정렬  (0) 2022.07.06
'C프로그래밍/개인 공부' 카테고리의 다른 글
  • C언어 - 10진수를 2진수로 바꾸기(재귀함수)
  • C언어 - 구조체와 포인터
  • C언어 - 간접 참조 연산자 *
  • C언어 - 쉽게 풀어쓴 C언어 express 10장 배열 실습문제(짝수번)
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    드라이버 분석
    피보나치
    리눅스
    c언어
    Qualcomm
    커널
    토발즈
    스택
    C++
    버퍼
    Branch
    시스템콜
    이진 트리
    yolo
    rubikpi3
    백준
    소수
    커널 기여
    파일 입출력
    포인터
    arm
    동적메모리
    INIT
    Git
    순환
    rubik pi
    commit
    자료구조
    앤드류모튼
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
C언어 - 문자열 변경, 문자열 상수와 포인터
상단으로

티스토리툴바