반응형

file.txt에 이런 형식의 데이터가 있다고 하고, \n으로 구분해서 한줄씩 배열에 담으려고 한다면

1. PlayStation
2. NintendoSwitch
3. Xbox


 char list[3][15] = {
	"PlayStation",
        "NintendoSwitch",
        "Xbox"
 };

이런식으로 2차원 배열의 1줄당 길이는 요소의 최대 길이로 작성하게 된다면

"Xbox"를 담으려고 했을 때 최대 길이는 15byte이니 11byte의 메모리가 낭비되게 된다.

 

그리고 만약 file.txt의 양이 방대하게 많다면 최대 길이가 몇byte인지 알기 어려워지기 때문에

가장 좋은 방법은 프로그램에서 동적으로 해결 해주는 것이다.

 

이것을 해결하기 위해 나는 

가변길이배열(VLA)포인터 배열을 사용하였다.

 

가변길이배열(VLA)는 여기를 참고하자.

2022.03.21 - [C언어/C언어 문법] - C언어 배열 선언할 때 배열의 길이를 변수나 상수가 아닌 값으로 사용하기 (VLA) 가변길이배열

 

C언어 배열 선언할 때 배열의 길이를 변수나 상수가 아닌 값으로 사용하기 (VLA) 가변길이배열

나는 원래 배열을 선언할 때 길이를 무조건 컴파일 타임 상수로 써야한다고 알고 있었고 그렇게 사용해오고 있었다. 하지만 개발하다보니 코드 낭비가 심했다. (쓸데없이 동적 할당을 하거나,

wonlf.tistory.com

 

아래 예제를 보면

#include <stdio.h>

int main() {
    char *str = "wonlf";
    char str2[] = "wonlf";
}

str에는 "wonlf" 중에 "w" 자리(맨 첫번째 값)의 주소값이 들어가게 된다.

str2[n]에는 "wonlf" 의 자리수마다 주소값이 들어간다.

 

쉽게 "w"의 주소가 00000000이라면

str에는 00000000이 들어가게 될것이고,

 

str2[0]에는 00000000 (w),

str2[1]에는 00000001 (o),

str2[2]에는 00000002 (n) .... more

이런 식으로 들어간다는 것이다.

 

 

이것을 포인터 배열에서 사용하여 보면,

#include <stdio.h>

int main() {
    char *str[] = {
            "wonlf", //주소값 00000000
            "me" //주소값 00000010
    };
}

str[0]에는 "w"의 주소값 00000000이 들어가게 될 것이고

str[1]에는 "m"의 주소값 00000010이 들어가게 될 것이다.

 

여기에 가변길이배열까지 접목시키면 

이런 식으로 사용할 수 있다.

 

 

 

 

 

 

아래의 블로그에서 많은 도움을 받았다.

https://mozi.tistory.com/239

반응형