• [잡담/일상] C 언어 sizeof 이해하기가 어렵네요2017.09.26 AM 07:28

게시물 주소 FONT글자 작게하기 글자 키우기

어제 솔직히 학원에서 집중을 잘 못햇습니다.

으으..

 

아래 문제... 답 풀이는 받앗는데

 

저번 과정까진 이해하고 잘 응용햇는데

 

간만에 sizeof가 나오니 갑자기 턱...

 

이게 뭐하는거엿지 하다가;;  이전에 수업내용 보니

뭔지는알겟는데 

 

또 요놈을 어케 응용하는건질 모르겟네요;;

 

정녕 플밍은 답이 없나.. 오늘은 함수도 나가는데..ㅠㅠ

 

 

-----------------------------------------------

가끔 헤더소스 많이 열어둘 때가잇는데ㅋㅋ;

빌드제외 시켜놓고 왜 컴파일이 안되지?

 

이런경우가 많더라구요;;ㅋㅋㅋㅋㅋ 코드는 맞는데 왜 안나오지!?

 

이러다가 30분만에 "아...이걸 다껏구나.."하고 멍청함을 다시 알게되는 경우가 많네요;;


 

 

 

// 가로의 길이가 9이고, 세로의 길이가 3인 배열을 선언하세요..

// 위 배열의 요소에 구구단의 2단부터 순서대로 입력하고, 출력하세요.

// 그리고, 출력된 각단의 열단위 값을 세로로 더한값을 한번더 출력하세요..

// 사용한 가능한 변수와 배열은 아래에 정의된 것만 사용해야 합니다..

// int data[3][9], i, j, res;

// 

//  2   4   6   8  10  12  14  16  18

//  3   6   9  12  15  18  21  24  27

//  4   8  12  16  20  24  28  32  36

//  ---------------------------------

//  9  18  27  36  45  54  63  72  81           // << 여기가 세로로 더한값..이걸 한번더 출력하란거


int data[3][9];

int i, j, res;


for (int i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {

for (int j = 0; j < sizeof(data[0]) / sizeof(int); ++j) {

data[i][j] = (i + 2) * (j + 1);

printf("%2d ", data[i][j]);

}

printf("\n");

}

printf("-------------------------------------\n");

for (int i = 0; i < sizeof(data[0]) / sizeof(int); ++i) {

res = 0;

for (int j = 0; j < sizeof(data) / sizeof(data[0]); ++j) {

res += data[j][i];

}

printf("%2d ", res);

}

printf("\n");



}

댓글 : 17 개
Sizeof는 그냥 배열의 사이즈를 가져오는 거에요 컴파일시에 상수로 변환되서 부담도 없음...

  • aksiz
  • 2017/09/26 AM 07:53
sizeof 를 배열에 사용할때는 그 배열의 총 메모리 할당량을 알려 주죠. 배열의 type 이 int 이므로, 그 메모리 크기를 int의 메모리 크기(sizeof(int))로 나누면 배열의 길이를 알 수 있습니다.

이경우 sizeof(data)/sizeof(data[0])는 3 을, sizeof(data[0])/sizeof(int)는 9의 값을 의미하는 경우가 되겠네요. 이걸 이용해서 정확한 배열의 길이만큼만 loop하는 조건을 설정 할 수 있는거죠.

다만 이게 배열을 함수로 넘겨주고 이럴때는 포인터화 되면서 배열의 총 메모리 할당량이 아닌 포인터의 사이즈를 알려주는등 좀 복잡해 지긴 하는데... 그건 일단 주의점으로 알고만 계시면 될듯 하네요.
sizeof(data) /sizeof(data[0]) ==>> 3
sizeof(data[0])/sizeof(int) ==>> 9
이렇게 보니 또 이해가 되는거같네요;; 흐흠;;
사실 sizeof는 포인트 치환시 크기 문제에 주로 사용했던 기억이 있습니다만.

아직 거기까진 아닌것 같고,

생각보다 다양하게 쓰입니다.

구조체 공용체등 크기를 알려면 잘쓰이죠.

또한 파일 호출시 남아있는 자료의 양을 알때도 쓰입니다.

물론 eof(end of file)가 에러 없이 하기에는 더 적합하지만.
전문 프로그래머는 아니지만 비슷한 분야에 종사허는 사람으로써 개인적인 견해를 적어보면
for 루프에 적힌 end 조건문에 sizeof(data) / sizeof(data[0]) 같은 구문 안씁니다.
저 data가 2차원 정적 배열이기 때문에 가능한 구문이지 동적 배열이 되는 순간 저 구문의 값은 1이 되서 로지컬 에러에 빠져버립니다. 경우에 따라 달라지는 구문이기 때문에 안쓰죠.

제가 코딩한다면 3과 9를 define 하거나 const variable로 선언하고 가져다 쓸겁니다

되도록이면 C를 배우지 마세요. 특히 학원강사한태 배우지 마세요. 구시대의 유물입니다.
으어어...으어,.,ㅇ
생각보다 크기를 아는게 중요하긴 합니다만..
프로그래밍은 너무 해야할게 많아서
os와 컴파일러에 따라 기본형도 메모리에 차지하는 바이트 수가 다를수 있어서
sizeof(int) 등을 쓰는 거죠
크기..ㅠ
윗분들이 이미 충분하리만치 설명들을 해주셔서 sizeof 관한건 언급안하겠습니다.
위에 소프! 님이 C가 구시대 유물이라고 하는데 이렇게 보시면 안되요..
시간이 흘러 얼마나 편한 고급언어가 나올지라도 편하게 쓰기위한거지 그걸 정의, 정석으로 보면 안되요.
로우레벨적 접근을 등한시 하면 그건 개발자로서 실격입니다.
초반부터 회로, 기계어, 어셈블리어 이런것들을 먼저해라고는 권하지 않지만
C언어 접근은 상당히 괜찮은 접근입니다.

요즘 무슨 개발자 국비지원이나 일반 중소기업 신입 개발자들이
기초공사도 안되어잇는데 자바같은 고오급언어를 내세워 응용단만 공략하려 해요.

그래서 버그가 생기면 프로그램에 대한 이해가 없어서 해결하지를 못합니다.

이런 기초공사를 익히는데도 C가 참 벨런스 좋은 수단이라 생각하고 사실 C로 못하는것도 없습니다
진짜 동의 22
C가 구시대의 유물이라니 -0-;; 저수준이 정말 중요한건데
C는 이번달까지 끝나고.. 다음에 C++이랑 자바를 배웁니다..;흐흠
사이즈 오브는 주로 스트럭트의 크기를 가져오는데 사용합니다.

스트럭트 A를 A의 크기만큼 동적 할당하는데 주로 사용하죠.

스트럭트 A는 엑셀이나 메타 데이터로부터 데이터를 저장하는 컨테이너의 역활을 주로 하고

해당 스트럭트는 파일에 변경사항이 있을대마다 쉽게 변할수 있습니다.

이럴때 상수값으로 코드에 밖기보다는 스트럭트 A의 변화에 따라 자연스럽게 해당 크기가 적용되도록 하는 효과가 있습니다.
사실 C에서는 배열크기등에 사항으로 쓰지만 크게 중요한건 아닙니다. 애초 프로그래머가 설계당시 메모리 관리를 위해서 정확한게 관리하고 있어야 되기 때문이죠.

다만 C++의 객체지향에서는 이부분이 달라집니다. 구조체나 동적배열과 포인터를 맴버변수로 가지고 있지 않은 상태에서 크기를 받을 수 있습니다. 이는 향후 다양한 클래스가 상속화 되어 있을때 클래스 식별에서도 사용 할 수 있는 하나의 방법이 됩니다.

또한 가지는 이러한 상속화를 통했을때 가변되는 클래스나 포인터 정의에 의한 다양한 구조체를 처리하게 될때 BLOB 타입으로 I/O 인,아웃풋 과정에서 사이징 계신이 필요할 때가 있습니다.

예를들어 32bit 컴파일과 64bit 컴파일은 주로사용하는 기본형 변수들과 시스템변수들의 자료형이 변경되는 경우가 있습니다. time 이라는 시스템변수는 32bit에서 4바이트 처리이지만 64에서는 8바이트 변경이 일어납니다. 포인터 주소의 크기도 이로인해서 바뀌게 되죠. 때문에 범용 코드로만든것에 sizeof를 사용하는 것으로 양쪽 모두 사용가능한 유연성을 가지게 됩니다.

sizeof 는 산수수준의 함수에용.
가만히 앉아서 위에 글들 잘 읽어보시면 금방 이해하실듯.
sizeof는 바이트 크기를 알려줍니다.
예를 들어서 sizeof의 결과값으로 4가 나오면 4바이트란 뜻입니다.
친구글 비밀글 댓글 쓰기