일상에서 멍때리기

[C] char[] 와 char *의 차이 본문

프로그래밍/개발이야기

[C] char[] 와 char *의 차이

로 얄 2014. 4. 14. 23:19
반응형

내가 얼마나 무지하면 어지껏 이 차이도 몰랐단 말인가.
약간의 삽질과 구글링을 통해 알아낸 내용이다.
너무도 간단하게 배열 = 포인터 라는 지식이 불러온 삽질이라 할 수 있다.

먼저 두 예제를 보자

1
code

  1. char str [ ] = "Hello World" ;
  2. str[3] = '3' ;
  3. printf ( "%s \n " , str ) ; 


result

Hel3o World

  
2
code

  1. char *str = "Hello World" ;
  2. str[3] = '3' ;
  3. printf ( "%s \n " , str ) ;


result

Segmentation Fault (Core Dumped)


코드상 큰 차이가 없어보이지만 선언 부의 작은 차이가 만들어 낸 결과이다.

1번의 char[] 의 경우 local data를 가지는 포인터이기 때문에 수정이 가능하다
하지만 2번의 char* 의 경우 global static data를 할당한 후 그의 포인터를 가지는 것이기 때문에 수정이 불가능 한것이다.

좀 더 자세히 gcc -S 로 어셈블리 코드를 보게되면

1번 char[] 의 경우 

 .file   "test.c"

    .text

.globl main

    .type   main, @function

main:

와 같이 global로 잡힌 string이없지만

2번 chat* 의 경우

  .file   "test.c"

    .section    .rodata

.LC0:

    .string "Hello World"

    .text

.globl main

    .type   main, @function

main:

와 같이 .rodata (read only data)에 Hello World가 잡혀있는 것을 확인할 수 있다. 


반응형

'프로그래밍 > 개발이야기' 카테고리의 다른 글

Ripple Effect ( 물결 효과, 왜곡 효과 )  (0) 2014.04.21
ruby on rails 폴더 구조  (0) 2014.04.14
[C] trim - string 함수 구현  (0) 2014.04.14
[C/C++] ++i 와 i++ 의 차이  (0) 2014.04.14
Comments