본문 바로가기

배열 길이 :: sizeof 나눗셈이 통하는 위치

2025.12.17 05:51:52 2

    • 글자 크기

C 언어에서 고정 배열의 길이는 전체 크기를 원소 하나의 크기로 나눠 얻는다.
실제 배열이 보이는 위치에서만 가능한 계산이다.

먼저 이해할 부분

sizeof samples는 배열 전체를 보고 sizeof samples[0]는 원소 자료형을 본다.
포인터에는 같은 공식을 적용할 수 없다.
sizeof 포인터는 가리키는 저장 공간이 아니라 주소 객체의 크기를 반환한다.

직접 실행할 코드

#include <stdio.h>
#include <stddef.h>

int main(void) {
    double samples[] = {1.5, 2.5, 3.5, 4.5};
    size_t n = sizeof samples / sizeof samples[0];
    double sum = 0;
    for (size_t i = 0; i < n; ++i)
        sum += samples[i];
    printf("count=%zu sum=%.1f\n", n, sum);
    return 0;
}

실행 결과

count=4 sum=12.0

원소를 추가하면 n도 자동으로 바뀐다.
원소 자료형이 바뀌어도 바이트 수를 직접 쓰지 않았으므로 계산식의 의미는 유지된다.
루프가 원소 수를 하드코딩하지 않는 것이 중요하다.

헷갈리기 쉬운 점

malloc으로 받은 포인터나 함수의 배열 매개변수에는 이 방법을 쓰지 않는다.
동적 배열은 길이를 별도로 보관하고 포인터와 함께 넘긴다.

빌드하기

예제는 C11 기준이다.
example.c로 저장한 뒤 아래 명령으로 빌드한다.
-Wall과 -Wextra는 의심스러운 코드에 대한 경고를 켠다.
경고가 없어도 배열 범위와 자료형의 표현 범위까지 보장되는 것은 아니다.

gcc -std=c11 -Wall -Wextra -Wpedantic example.c -o example
./example

참고: C11 위원회 초안

전자기기 쪽으로 문외한 저희 부모님과 지인을 보고 컴퓨터 쪽에 지식이 없는 분들도 쉽게 프로그램을 이용할 수 있도록 하자는 생각으로 포스팅을 하고 있으며 유익한 정보를 최대한 많이 담아두는 것이 저의 궁극적인 목표입니다.
execv() :: 인수 배열로 새 프로그램 실행하기 execl() :: 인수 목록으로 새 프로그램 실행하기

답글 달기

전화번호 또는 이메일을 남겨두시면 댓글이 달렸을경우 알려드립니다.
사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

번호 제목 날짜
241 sigaddset() :: 시그널 집합에 항목 추가하기 2026.01.02
240 sigfillset() :: 모든 시그널을 포함하는 집합 만들기 2026.01.02
239 배열 비교 :: std::array는 원소 순서대로 비교한다 2026.01.02
238 sigemptyset() :: 비어 있는 시그널 집합 만들기 2026.01.02
237 sigaltstack() :: 시그널 핸들러용 대체 스택 지정하기 2026.01.01
236 sigqueue() :: 정수나 포인터 값을 포함한 시그널 보내기 2026.01.01
235 sigtimedwait() :: 제한 시간 안에서 시그널 기다리기 2026.01.01
234 포인터 :: 주소와 그 주소의 값 구분하기 2026.01.01
233 sigwaitinfo() :: 시그널과 부가 정보를 함께 기다리기 2026.01.01
232 sigwait() :: 시그널 집합 중 하나를 동기적으로 기다리기 2025.12.31
231 sigsuspend() :: 일시적인 마스크로 시그널 기다리기 2025.12.31
230 sigpending() :: 처리 대기 중인 시그널 목록 얻기 2025.12.31
229 std::array::back() :: 마지막 원소에 접근하기 2025.12.31
228 sigprocmask() :: 호출 스레드의 시그널 마스크 변경하기 2025.12.30
227 sigaction() :: 시그널 처리 동작을 구조체로 지정하기 2025.12.30
226 raise() :: 현재 실행 흐름에 시그널 발생시키기 2025.12.30
225 killpg() :: 프로세스 그룹에 시그널 보내기 2025.12.30
224 문자열 리터럴 :: 포인터와 수정 가능한 배열 2025.12.30
223 kill() :: 프로세스 또는 그룹에 시그널 보내기 2025.12.29
222 getentropy() :: 작은 크기의 보안 난수 버퍼 채우기 2025.12.29
221 getrandom() :: 커널에서 안전한 난수 바이트 얻기 2025.12.29
220 fork() :: 현재 프로세스를 복제하기 2025.12.29
219 std::array::front() :: 첫 원소 참조 얻기 2025.12.29
218 confstr() :: 런타임 설정 문자열 얻기 2025.12.27
217 fpathconf() :: 열린 파일의 파일 시스템 제한 조회하기 2025.12.27
216 심볼릭 링크 :: 다른 경로를 가리키는 파일 2025.12.27
215 pathconf() :: 특정 경로의 파일 시스템 제한 조회하기 2025.12.26
214 문자 배열 :: 널 종료 문자까지 공간 확보하기 2025.12.26
213 sysconf() :: 런타임 시스템 설정값 조회하기 2025.12.26
212 sysinfo() :: 메모리와 시스템 부하 정보 얻기 2025.12.26
211 uname() :: 커널과 시스템 식별 정보 얻기 2025.12.26
210 sched_yield() :: 다른 실행 가능한 스레드에 CPU 양보하기 2025.12.25
209 std::array::empty() :: 길이가 0인 고정 배열 2025.12.25
208 sched_setaffinity() :: 스레드가 실행할 CPU 집합 제한하기 2025.12.25
207 sched_getaffinity() :: 실행이 허용된 CPU 집합 조회하기 2025.12.25
206 sched_getcpu() :: 현재 스레드가 실행 중인 CPU 번호 얻기 2025.12.25
205 지정 초기화 :: 배열의 원하는 위치만 채우기 2025.12.24
204 setpriority() :: 프로세스 집합의 nice 값 바꾸기 2025.12.24
203 getpriority() :: nice 우선순위 값 조회하기 2025.12.24
202 nice() :: 프로세스의 스케줄링 우선순위 조정하기 2025.12.24
201 prlimit() :: 다른 프로세스의 자원 한도 조회와 설정하기 2025.12.24
200 std::array::size() :: 저장한 원소 개수 얻기 2025.12.23
199 setrlimit() :: 프로세스 자원 한도 바꾸기 2025.12.23
198 getrlimit() :: 프로세스 자원 한도 조회하기 2025.12.23
197 getsubopt() :: 쉼표로 구분된 하위 옵션 해석하기 2025.12.23
196 getopt_long() :: 긴 이름을 가진 명령행 옵션 해석하기 2025.12.23
195 2차원 배열 :: 행과 열을 나눠 순회하기 2025.12.22
194 getopt() :: 짧은 명령행 옵션 해석하기 2025.12.22
193 clearenv() :: 환경 변수 목록 비우기 2025.12.22
192 unsetenv() :: 환경 변수 제거하기 2025.12.22
191 setenv() :: 환경 변수 값 설정하기 2025.12.22
190 std::array::data() :: 연속 저장 공간을 포인터로 넘기기 2025.12.21
189 secure_getenv() :: 보안 실행 환경을 고려해 환경 변수 읽기 2025.12.21
188 getenv() :: 환경 변수 문자열 읽기 2025.12.21
187 abort() :: 비정상 종료를 발생시키기 2025.12.21
186 atexit() :: 정상 종료 시 호출할 함수 등록하기 2025.12.21
185 배열 복사 :: 포인터 대입과 원소 복사의 차이 2025.12.20
184 exit() :: 표준 정리 절차를 거쳐 프로세스 끝내기 2025.12.20
183 pclose() :: popen 스트림을 닫고 명령 종료 상태 얻기 2025.12.20
182 popen() :: 명령의 표준 입출력을 FILE 스트림으로 연결하기 2025.12.20
181 inode :: 리눅스 파일의 진짜 식별자 2025.12.20
180 std::array::fill() :: 모든 원소를 같은 값으로 채우기 2025.12.19
179 chmod :: 리눅스 파일 권한 변경하기 2025.12.19
178 system() :: 셸을 통해 명령 문자열 실행하기 2025.12.19
177 posix_spawnp() :: PATH를 검색하는 방식으로 프로그램 생성하기 2025.12.19
176 posix_spawn() :: 프로세스 생성과 프로그램 실행을 함께 요청하기 2025.12.19
175 배열 매개변수 :: 주소와 길이를 함께 넘기기 2025.12.18
174 execveat() :: 디렉터리 기준 경로로 프로그램 실행하기 2025.12.18
173 fexecve() :: 열린 실행 파일 디스크립터로 프로그램 실행하기 2025.12.18
172 execvpe() :: PATH와 환경 배열을 사용해 프로그램 실행하기 2025.12.18
171 std::array::at() :: 인덱스 범위를 검사하며 접근하기 2025.12.18
170 execlp() :: PATH에서 실행 파일을 찾아 인수 목록으로 실행하기 2025.12.17
169 execvp() :: PATH에서 실행 파일을 찾아 인수 배열로 실행하기 2025.12.17
168 execle() :: 인수 목록과 환경 배열로 프로그램 실행하기 2025.12.17
167 execv() :: 인수 배열로 새 프로그램 실행하기 2025.12.17
배열 길이 :: sizeof 나눗셈이 통하는 위치 2025.12.17
165 execl() :: 인수 목록으로 새 프로그램 실행하기 2025.12.16
164 setsid() :: 새 세션과 프로세스 그룹 만들기 2025.12.16
163 getsid() :: 세션 ID 조회하기 2025.12.16
162 getpgrp() :: 현재 프로세스 그룹 ID 얻기 2025.12.16
161 std::array :: 길이가 자료형에 들어가는 배열 2025.12.16
160 setpgid() :: 프로세스를 지정한 그룹으로 옮기기 2025.12.15
159 getpgid() :: 프로세스 그룹 ID 얻기 2025.12.15
158 gettid() :: 현재 커널 스레드 ID 얻기 2025.12.15
157 getppid() :: 부모 프로세스 ID 얻기 2025.12.15
156 배열 인덱스 :: 마지막 원소와 한 칸 뒤 구분하기 2025.12.15
155 getpid() :: 현재 프로세스 ID 얻기 2025.12.14
154 wait4() :: 지정한 자식의 상태와 자원 사용량 얻기 2025.12.14
153 wait3() :: 자식 상태와 자원 사용량 함께 얻기 2025.12.14
152 waitid() :: 대상과 상태 종류를 지정해 자식 기다리기 2025.12.14
151 범위 for 참조 변수 :: 원소를 제자리에서 바꾸기 2025.12.14
150 waitpid() :: 지정한 자식 프로세스 상태 기다리기 2025.12.13
149 wait() :: 종료한 자식 프로세스 하나 회수하기 2025.12.13
148 tzset() :: 환경 변수에서 시간대 규칙 다시 읽기 2025.12.13
147 getrusage() :: 프로세스의 CPU와 메모리 자원 사용량 조회하기 2025.12.13
146 배열 초기화 :: 생략한 원소는 무엇이 될까 2025.12.13
145 times() :: 프로세스와 자식의 CPU 사용 시간 조회하기 2025.12.12
144 clock() :: 프로세스가 사용한 CPU 시간 얻기 2025.12.12
143 difftime() :: 두 타임스탬프 사이의 초 차이 구하기 2025.12.12
142 Here document :: 여러 줄 입력을 명령에 전달하기 2025.12.12
141 범위 for 값 변수 :: 원소를 복사해서 읽기 2025.12.11
140 strptime() :: 형식 문자열로 날짜와 시각 해석하기 2025.12.11
139 strftime() :: 시각 구조체를 형식화한 문자열로 만들기 2025.12.11
138 xargs :: 표준 입력을 명령 인수로 바꾸기 2025.12.11
137 enum :: 상태 값에 이름 붙이기 2025.12.10
136 timegm() :: UTC 시각 구조체를 타임스탬프로 변환하기 2025.12.10
135 mktime() :: 지역 시각 구조체를 타임스탬프로 변환하기 2025.12.10
134 gmtime_r() :: 타임스탬프를 UTC 시각 구조체로 변환하기 2025.12.10
133 localtime_r() :: 타임스탬프를 지역 시각 구조체로 변환하기 2025.12.10
132 auto& :: 추론하면서 원본을 수정하기 2025.12.09
131 timer_getoverrun() :: POSIX 타이머 통지 누락 횟수 얻기 2025.12.09
130 timer_gettime() :: POSIX 타이머 남은 시간 조회하기 2025.12.09
129 timer_settime() :: POSIX 타이머 만료 시각과 반복 주기 설정하기 2025.12.09
128 timer_delete() :: POSIX 타이머 삭제하기 2025.12.09
127 typedef :: 자료형에 의미 있는 이름 붙이기 2025.12.08
126 timer_create() :: POSIX 타이머 만들기 2025.12.08
125 getitimer() :: 프로세스 interval timer 상태 조회하기 2025.12.08
124 setitimer() :: 프로세스 interval timer 설정하기 2025.12.08
123 alarm() :: 일정 시간 뒤 SIGALRM 예약하기 2025.12.08
122 참조와 포인터 :: 선택적인 대상은 어떻게 표현할까 2025.12.06
121 sleep() :: 초 단위로 실행 멈추기 2025.12.06
120 clock_nanosleep() :: 시계를 지정해 절대 또는 상대 시간만큼 기다리기 2025.12.06
119 nanosleep() :: 초와 나노초 단위로 실행 멈추기 2025.12.06
118 clock_settime() :: 선택한 시계의 시각 변경하기 2025.12.06
117 const :: 바꾸지 않을 객체 표시하기 2025.12.05
116 clock_getres() :: 선택한 시계의 시간 해상도 얻기 2025.12.05
115 clock_gettime() :: 선택한 시계의 현재 시각 얻기 2025.12.05
114 gettimeofday() :: 현재 시각을 초와 마이크로초로 얻기 2025.12.05
113 time() :: 에포크 이후 현재 초 수 얻기 2025.12.05
112 const 참조 :: 복사 없이 읽기만 하기 2025.12.04
111 mkdtemp() :: 충돌을 피하며 임시 디렉터리 만들기 2025.12.04
110 mkstemp() :: 충돌을 피하며 임시 파일 안전하게 만들기 2025.12.04
109 tmpfile() :: 자동 정리되는 임시 파일 스트림 만들기 2025.12.04
108 open_memstream() :: 동적으로 커지는 메모리 출력 스트림 만들기 2025.12.04
107 부호 혼합 비교 :: 음수와 배열 길이 비교하기 2025.12.03
106 fmemopen() :: 메모리 버퍼를 FILE 스트림으로 열기 2025.12.03
105 read :: 셸에서 한 줄씩 안전하게 읽기 2025.12.03
104 funlockfile() :: FILE 스트림 내부 잠금 해제하기 2025.12.03
103 lvalue 참조 :: 원본에 다른 이름 붙이기 2025.12.02
102 "$@"와 "$*" :: 셸 함수 인수 전달 차이 2025.12.02
101 ftrylockfile() :: FILE 스트림 잠금을 기다리지 않고 시도하기 2025.12.02
100 flockfile() :: FILE 스트림의 내부 잠금 획득하기 2025.12.02
99 setbuf() :: FILE 스트림 버퍼 제공하기 2025.12.01
98 정수 나눗셈 :: 소수 부분이 사라지는 위치 2025.12.01
97 setvbuf() :: FILE 스트림 버퍼링 방식 설정하기 2025.12.01
96 perror() :: 현재 errno 설명을 표준 오류에 출력하기 2025.12.01
95 clearerr() :: 스트림의 EOF와 오류 표시 지우기 2025.12.01
94 ferror() :: 스트림의 오류 표시 확인하기 2025.11.29
93 값 초기화 :: {}로 기본 값을 만들기 2025.11.29
92 feof() :: 스트림의 EOF 표시 확인하기 2025.11.29
91 fsetpos() :: 저장한 스트림 위치로 복원하기 2025.11.29
90 fgetpos() :: 스트림 위치와 상태를 저장하기 2025.11.26
89 rewind() :: 스트림 위치를 처음으로 되돌리기 2025.11.26
88 정수 리터럴 :: 진법과 접미사 구분하기 2025.11.26
87 ftello() :: off_t 기반으로 FILE 현재 위치 얻기 2025.11.26
86 ftell() :: FILE 스트림의 현재 위치 얻기 2025.11.26
85 fseeko() :: off_t 기반으로 FILE 위치 이동하기 2025.11.25
84 fseek() :: FILE 스트림의 파일 위치 바꾸기 2025.11.25
83 중괄호 초기화 :: 축소 변환을 진단받기 2025.11.25
82 fflush() :: 스트림의 출력 버퍼 기록하기 2025.11.25
81 ungetc() :: 문자 하나를 스트림 입력으로 되돌리기 2025.11.24
80 fwrite() :: 원소 배열을 FILE 스트림에 쓰기 2025.11.24
79 puts() :: 문자열과 개행을 표준 출력에 쓰기 2025.11.24
78 int32_t :: 정확한 비트 폭이 필요할 때 2025.11.24
77 fputs() :: 널 종료 문자열을 스트림에 쓰기 2025.11.23
76 putchar() :: 표준 출력에 문자 하나 쓰기 2025.11.23
75 putc() :: 스트림에 문자 하나 출력하기 2025.11.23
74 fputc() :: FILE 스트림에 문자 하나 쓰기 2025.11.23
73 static_assert :: 잘못된 가정을 빌드에서 잡기 2025.11.23
72 fread() :: FILE 스트림에서 원소 배열 읽기 2025.11.22
71 getdelim() :: 지정한 구분자까지 버퍼를 늘려 읽기 2025.11.22
70 getline() :: 필요하면 버퍼를 늘려 한 줄 읽기 2025.11.22
69 size_t :: 크기와 인덱스를 담는 자료형 2025.11.22
68 exec :: 현재 셸을 다른 프로그램으로 교체하기 2025.11.22
67 fgets() :: 크기를 제한해 한 줄 읽기 2025.11.21
66 trap :: 셸 스크립트 종료 시 정리 작업하기 2025.11.21
65 getchar() :: 표준 입력에서 문자 하나 읽기 2025.11.21
64 constexpr :: 컴파일 때 계산할 수 있는 값 2025.11.21
63 getc() :: 스트림에서 다음 문자 읽기 2025.11.21
62 fgetc() :: FILE 스트림에서 문자 하나 읽기 2025.11.20
61 vsscanf() :: 가변 인수 목록으로 문자열 해석하기 2025.11.20
60 vfscanf() :: 가변 인수 목록으로 FILE 입력 해석하기 2025.11.20
59 sizeof :: 자료형과 객체의 바이트 수 2025.11.20
58 vscanf() :: 가변 인수 목록으로 표준 입력 해석하기 2025.11.20
57 sscanf() :: 문자열에서 형식에 맞춰 값 추출하기 2025.11.19
56 fscanf() :: FILE 스트림에서 형식에 맞춰 값 읽기 2025.11.19
55 scanf() :: 표준 입력에서 형식에 맞춰 값 읽기 2025.11.19
54 enum class :: 범위가 있는 열거형 만들기 2025.11.19
53 vasprintf() :: 가변 인수 목록으로 새 문자열 할당하기 2025.11.19
52 vdprintf() :: 가변 인수 목록을 디스크립터로 출력하기 2025.11.17
51 vsnprintf() :: 가변 인수 목록으로 길이 제한 문자열 만들기 2025.11.17
50 vfprintf() :: 가변 인수 목록으로 스트림에 출력하기 2025.11.17
49 float와 double :: 소수의 정밀도 확인하기 2025.11.17
48 vprintf() :: 가변 인수 목록으로 표준 출력하기 2025.11.17
47 asprintf() :: 필요한 버퍼를 할당해 형식화한 문자열 만들기 2025.11.16
46 dprintf() :: 파일 디스크립터에 형식화해서 출력하기 2025.11.16
45 snprintf() :: 버퍼 크기를 제한해 형식화한 문자열 만들기 2025.11.16
44 using :: 긴 자료형에 별칭 붙이기 2025.11.16
43 fprintf() :: 형식화한 내용을 지정한 FILE 스트림에 쓰기 2025.11.14
42 printf() :: 형식 문자열을 사용해 표준 출력에 쓰기 2025.11.14
41 lldiv() :: long long 정수의 몫과 나머지 함께 구하기 2025.11.14
40 ldiv() :: long 정수의 몫과 나머지 함께 구하기 2025.11.14
39 _Bool :: 참과 거짓을 저장하기 2025.11.10
38 div() :: int 정수의 몫과 나머지 함께 구하기 2025.11.10
37 llabs() :: long long 정수의 절댓값 구하기 2025.11.10
36 labs() :: long 정수의 절댓값 구하기 2025.11.10
35 decltype :: 식의 자료형을 그대로 확인하기 2025.11.10
34 abs() :: int 정수의 절댓값 구하기 2025.11.09
33 $? :: 셸에서 바로 전 명령의 종료 상태 확인하기 2025.11.09
32 strtold() :: 문자열을 long double 실수로 변환하기 2025.11.09
31 set -euo pipefail :: 셸 스크립트 실패를 빨리 발견하기 2025.11.09
30 char :: 문자와 작은 정수를 구분하기 2025.11.09
29 strtod() :: 문자열을 double 실수로 변환하기 2025.11.08
28 strtof() :: 문자열을 float 실수로 변환하기 2025.11.08
27 strtoumax() :: 문자열을 최대 폭 비부호 정수로 변환하기 2025.11.08
26 strtoimax() :: 문자열을 최대 폭 부호 정수로 변환하기 2025.11.08
25 auto :: 초기값에서 자료형 추론하기 2025.11.07
24 strtoull() :: 문자열을 unsigned long long 정수로 변환하기 2025.11.07
23 strtoul() :: 문자열을 unsigned long 정수로 변환하기 2025.11.07
22 strtoll() :: 문자열을 long long 정수로 변환하기 2025.11.07
21 strtol() :: 문자열을 long 정수로 변환하기 2025.11.07
20 short와 long :: 이름보다 범위를 확인하기 2025.11.06
19 toupper() :: 문자를 대문자로 바꾸기 2025.11.06
18 tolower() :: 문자를 소문자로 바꾸기 2025.11.06
17 isxdigit() :: 16진수 숫자 문자인지 판별하기 2025.11.06
16 isupper() :: 대문자인지 판별하기 2025.11.06
15 nullptr :: 정수 0과 다른 널 포인터 표현 2025.11.05
14 isspace() :: 공백과 개행 같은 공백 문자인지 판별하기 2025.11.05
13 ispunct() :: 구두점 문자인지 판별하기 2025.11.05
12 isprint() :: 공백을 포함한 출력 가능 문자인지 판별하기 2025.11.05
11 islower() :: 소문자인지 판별하기 2025.11.05
10 unsigned int :: 음수가 없는 정수의 순환 2025.11.03
9 isgraph() :: 공백을 제외한 출력 가능 문자인지 판별하기 2025.11.03
8 isdigit() :: 십진수 숫자 문자인지 판별하기 2025.11.03
7 RAII :: 자원 수명을 객체 수명에 묶기 2025.11.03
6 iscntrl() :: 제어 문자인지 판별하기 2025.11.02
5 bool :: 조건 결과를 값으로 보관하기 2025.11.02
4 std::string_view :: 문자열을 복사하지 않고 바라보기 2025.11.01
3 isblank() :: 수평 공백 문자인지 판별하기 2025.11.01
2 isalpha() :: 알파벳 문자인지 판별하기 2025.11.01
1 int :: 정수의 범위부터 확인하기 2025.11.01

게시글 URL이 복사되었습니다.

비회원이 작성한 게시글은 댓글 작성마다 닉네임이 변경되므로 동일인임을 알 수 있도록 IP 주소 배열 2번째까지 공개합니다.

SKT, KT, LG U+ : 각 통신사 사용자가 남긴 댓글입니다.

Personal : 와이파이나 랜선에 직접 연결된 사용자가 남긴 댓글입니다.

회원만 다운로드가 가능합니다.
확인을 누르면 회원가입 페이지로 이동합니다.

회원이라면 로그인 후 다시 시도해 보세요.
확인을 누르면 회원가입 페이지로 이동합니다.

글을 모두 읽을때까지 소요되는 추정 시간 입니다.

업로드/다운로드 속도는 서버의 네트워크 트래픽 정보 입니다.
개별 사용자의 속도와는 관련이 없습니다.

콕 찔렀습니다!

PC가 이미 켜져 있습니다.

알 수 없는 오류가 발생했습니다.

PC에 전원 ON 명령을 요청했습니다.

PC 전원이 켜졌습니다.