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; //컴파일 오류가 난다.
}
'C Language' 카테고리의 다른 글
C언어 재귀적 알고리즘 : 하노이 탑 문제 (0) | 2024.06.19 |
---|---|
C언어 static, register, volatile 지정자 개념 (2) | 2024.06.19 |
C언어 전역변수와 지역변수, 매개변수(+가변매개변수)의 개념 (2) | 2024.06.19 |
C언어 사용자 정의 함수 (0) | 2024.06.19 |
C언어 라이브러리의 rand() 함수 (0) | 2024.06.18 |