C Language

C언어 배열에 대해 학습하기 (1)

567Rabbit 2024. 6. 19. 13:42

 

 

int scores[인덱스];

float scores[인덱스];

char scores[인덱스];

...

 

인덱스(index) : 배열 원소의 번호 0~n-1

- 배열 요소에는 인덱스로 접근할 수 있다.

- 인덱스 안에 수식도 작성할 수 있다.

 

score[i] = 100;

score[i + 2] = 100;

 

 

 

- 배열의 가장 큰 장점은 반복문을 사용하여서 배열의 원소를 간편하게 처리할 수 있다는 점이다.

 

 

 

 

 

 

 

 

세그먼테이션 포트(segmentation fault)

 

- 세그멘테이션(segmentation)은 메모리 관리 기법 중 하나로, 프로세스가 사용하는 메모리를 서로 다른 크기의 논리적 단위인 세그먼트(segment)로 나누어 관리하는 방법

- 이 기법은 주소 공간을 논리적으로 분할함으로써 메모리 보호와 가상 메모리 관리를 용이하게 함

- 세그멘테이션 포트(segmentation fault)는 프로그램이 잘못된 메모리 접근을 시도할 때 발생하는 오류를 의미함

 

(잘못된 인덱스)

- 인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류를 발생시킨다.

- 예기치 않은 동작이나 프로그램의 비정상 종료를 초래할 수 있다.

 

ex)

 

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;  // 배열의 첫 번째 원소를 가리키는 포인터

    // 유효한 인덱스 범위 내에 있는 원소에 접근
    printf("Before out-of-bound access: arr[3] = %d\n", arr[3]);

    // 배열 범위를 넘어서는 곳에 접근하여 데이터 저장
    ptr[10] = 100;  // arr 배열의 범위를 넘어서는 인덱스에 데이터 저장

    // 유효한 인덱스 범위 내의 원소 값 확인
    printf("After out-of-bound access: arr[3] = %d\n", arr[3]);
    printf("Value at ptr[10] (out-of-bound access): %d\n", ptr[10]);

    return 0;
}

 

 

 

 

 

배열의 초기값과 초기화

// 원소의 초기값을 콤마로 분리하여 중괄호 안에 나열한다
int scores[5] = { 10, 20, 30, 40, 50 }
// 초기값을 일부만 주면 나머지 원소들은 0으로 초기화된다.
int scores[5] = { 10, 20, 30 }
// 배열의 크기가 주어지지 않은 경우에는 초기값의 개수가 배열의 크기가 된다
// 즉, 오른쪽 중괄호 안의 개수만큼 배열의 크기로 지정된다.
int scores[] = { 10, 20, 30, 40, 50 };

 

 

초기화 하는 방법

int score[인덱스] = { 0 };

 

- 초기화 하지 않으면 쓰레기값이 남아서 배열에 이상한 것이 위치할 수 있으니 초기화 해야 한다.

 

 

 

 

 

배열의 비교

 

- 다른 공간에 할당되었으므로 a와 b는 같지 않다.

#include <stdio.h>
#define SIZE 5

int main(void) {
    int i;
    int a[SIZE] = { 1, 2, 3, 4, 5 };
    int b[SIZE] = { 1, 2, 3, 4, 5 };
    
    return 0;
    
    // 올바르지 않은 배열 비교
    if( a == b )
    	printf("잘못된 결과입니다.\n");
    else
    	printf("잘못된 결과입니다.\n");
        
        
    // 올바른 배열 비교
    for( i = 0 ; i < SIZE ; i++ )
    {
    	if( a[i] != b[i] )
        {
            printf("a[]와 b[]는 같지 않습니다.\n");
            return 0;
        }
    }
}

 

 

 

 

 

배열과 함수

 

(배열이 함수의 인수인 경우)

 

- 배열이 함수의 인수로 전달될 때, C 언어에서는 배열의 주소가 전달된다.

- 이는 함수에 배열을 전달할 때 배열의 복사본이 아니라 배열의 첫 번째 요소의 메모리 주소가 전달되는 것을 의미한다.

- 따라서 함수 내에서 배열의 원본 값을 변경하면, 호출된 곳에서도 해당 변경 사항이 반영된다.

#include <stdio.h>
#define SIZE 7

void square_array(int a[], int size);
void print_array(int a[], int size);

int main(void)
{
    int list[SIZE] = { 1, 2, 3, 4, 5, 6, 7 };
    
    print_array(list, SIZE);
    square_array(list, SIZE);
    print_array(list, SIZE);
    
    return 0;
}

void square_array(int a[], int size)
{
    int i;
 	
    for(i = 0 ; i < size ; i++)
    	a[i] = a[i] * a[i];
}

void print_array(int a[], int size)
{
    int i;
 	
    for(i = 0 ; i < size ; i++)
    	printf("%3d", a[i]);
    printf("\n");
}

 



 

 

원본 배열의 변경을 금지하는 방법

void print_array(const int a[], int size) //함수 안에서 a[]는 변경할 수 없다
{
	...
    a[0] = 100; //컴파일 오류가 난다. 
}