[C]문자열과 포인터

반응형

String = "archie";

컴파일러는 "archie"중에 'a'가 저장된 곳의 주소를 string에 할당한다.

"archie"는 문자열 상수다.(상수라 변경이 불가함)


*(string +3)  == string[3] == *(3+string) ==3[string]

다른 언어에서 [ ]는 배열의 범위를 나타내지만 C언어에서의 [ ]는 연산자이다. 두개의 피 연산자를 가지며 하나의 피 연산자는 기본 위치를, 다른 피 연산자는 기본위치에서 얼마만큼 떨어져 있는지를 나타낸다. 순서가 상관 없다.


1. char *string = "archie";

2. char dim[] = "dimention";

string은 포인터 변수이기 때문에 메모리 할당을 받고 dim은 배열명이기 때문에 메모리 할당을 받지 않는다. dim과 &dim, &dim[0]는 모두 같다.

1. archie가 어딘가에 저장되고 'a'의 주소가 string에 할당된다. string이라는 변수와 "archie"라는 문자열은 별개로 존재한다.

2. dim은 배열이다. "dimention" 문자열이 하나씩 dim배열에 할당된다. 


1. string++;

2. dim++;

1번은 string = string +1; 로 string이 가리키던 'a'의 주소에 +1을 하여 'r'을 가리키게 된다.

2번은 dim = dim +1;로 dim+1은 'i'가 저장된 곳의 주소를 가리킨다. 이 값을 dim배열명 자체에 넣으려고 하고 있는데 dim은 배열명이지 변수가 아니다.

dim은 변수가 아닌 배열 상수이다.


char *string = "archie";

*string ='T';

//Segmentation Fault(memory dump)


char string[]="dimention";

string[0] = 'T';

puts(string);

//Timention


문법적으로 'T'라는 문자가 string이 가리키고 있는 번지에 할당된다로 해석된다.

"archie"는 문자열 상수다. 상수는 변화될 수 없으며 string이 가리키고 있는 주소에는 변수가 아닌 상수가 들어 있으므로 컴파일 에러가 난다.



<<포인터 배열>>

char name[5][20];

name[0] = "archie";//오류가 발생

"archie"문자열 중 'a'가 저장된 위치를 name[0]에 넣으려고 하고 있다. name이라는 배열명이 배열 상수인것 처럼 name[0], name[1]....는 모두 상수다. 이런 이유로 주소값 할당이 불가능하다.

strcpy(name[0], "archie"); 처럼 사용해야 한다.


char *name[5];

name[0]="archie";//정상적으로 처리

name은 포인터 배열이다. 포인터를 저장할 수 있는 배열이며 포인터 저장 공간이 모두 5개 생겼다.

name[0] 포인터 배열 변수에 'a'가 저장된 곳의 주소를 할당하고 있다.

char name[5][20]에서 배열명 자체는 메모리가 할당되지 않는 것 처럼 char *name[5] 포인터 배열도 name[0]..이 메모리에 할당되며 각각은 주소를 저장할 수 있다. 하지만 name이라는 포인터 배열명은 절대 메모리가 할당되지 않는다.


char *name[5];

name[0] = "archie";//'a'주소를 name[0]에 할당

strcpy(name[0], "archie");//name[0]에 저장된 garbage주소에 'a'주소 값을 복사//오류가능성 높음




포인터 배열을 사용하며 strcpy()를 이용할 수 있는 방법


char *name[5];


1) name[0] = (char *)malloc(sizeof(char) *strlen("archie")+1;


2) char imsi[7];

    name[0] = imsi;



strcpy(name[0],"archie");

1) malloc()을 이용해 안전한 공간을 할당해 준다.

2) 배열을 이용해 주소를 초기화 한다.



from 다시 체계적으로 배우는 C언어 포인터(정재은)

반응형

'IT > 개발의짜릿함' 카테고리의 다른 글

[nodejs]npm설치 시 proxy 이슈  (0) 2018.04.30
정규식 표현식  (0) 2018.01.19
SQL변수 java변수 변환(_소문자를 대문자로)  (0) 2017.12.11

Top