본문 바로가기

Study/C언어11

C언어 - 배열과 스택, 버퍼 오버플로우 배열과 스택은 밀접한 관계가 있다. 스택은 쌓이는 것 같은 이미지를 떠올리지만 사실 배열로 구성되어 있다. 어떻게 구성되어 있는지 아래 코드와 설명을 보며 이해하자. 코드 #include int main() { char ch1[2]; char ch2[2]; char ch3[2]; printf( "문자 입력\n" ); /*scanf의 오류때문에 scanf_s를 쓰는경우엔 'scanf_s("%s",ch1,버퍼의 크기);'와 같이 3개의 인자를 넣어주어야 한다. '_s'가 오버플로우 현상을 잡기위해 만든것이므로 _s에선 오류가 발생하지 않는다.*/ scanf( "%s", ch1); //scanf_s와 같이 _s를 쓰는 연산자는 설정에서 sdl체크를 해제해주면 _s없이 사용 할 수 있다. scanf( "%s",.. 2020. 6. 3.
C언어 - 여러가지 포인터와 배열의 조합, 출력값 1. 기본 출력 코드 #include int main (void) // 1. { int a =1, b=2, c=3; int *sum=&a; printf("*sum = %d\n", *sum); // 1 출력 printf("&a = %d\n", &a); // 주소값 출력 printf("a = %d\n", a); // 1 출력 *sum = 123; // sum이 가리키고 있는 a값에 123 입력 printf("*sum = %d\n", *sum); // 123 출력 printf("a = %d\n", a); // 123 출력 sum = 123; printf("sum = %d\n", sum); // 123 출력 printf("a = %d\n", a); // 123출력 return 0; } 출력 2. 상수와 주소값 .. 2018. 12. 20.
C언어 - 다양한 자료형의 10진수 정수값 구하기 & 오류가 나는 이유 123456789101112131415161718192021#include void main(){ double num1 = 123456; // 결과값 : 0 float num2 = 123456; // 결과값 : 1090397184 int num3 = 123456; // 결과값 : 0 double num4 = 123456.123456; // 결과값 1090397184 float num5 = 123456.123456; // 결과값 123456 int num6 = 123456.123456; // 결과값 -106102872 printf( "10진수 정수형 출력하기\n============================\n" ); printf( "double num1 : %d\n float num2 : %d\n i.. 2018. 12. 20.
C언어 - 2차원 배열과 메모리 크기 2차원 이상의 배열에서 우리가 간과하는것이 있다. 배열의 모양이 우리가 상상하는 3D 상자모양처럼 될 것이라는 생각이다. 2차원 이상의 배열은 1차원 배열과 동일하게 일직선 선형으로 보관된다. [3][3] 의 2차원 배열의 경우 - 예상 [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2] - 실제 [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2] 위와 같은 그림으로 메모리상에 일직선으로 나타난다. [3][2]의 2차원 배열 예제를 보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include int main(void ) { int .. 2018. 12. 20.
C언어 - 포인터 Call-By-Value와 Call-By-Reference의 구분, 더블포인터의 이해 예제 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include int num1 = 10; int num2 = 20; int changednum_value(int x,int y) { int nonnum1 = x ; x = y ; y = nonnum1; } int changednum_reference2(int **o, int **p) { int nonnum2 = **o ; ** o = **p ; ** p = nonnum2; } // 더블 포인터를 썼기 때문에 매개변수에 더블 포인터를 .. 2018. 12. 17.
C언어 - sacnf의 &(주소연산자) scanf에 &(주소연산자)가 들어가는 이유. scanf에 입력을 받을 때에는 앞서 선언한 변수와 서식문자(%d 같은)에 의해 메모리 공간이 미리 할당되어 있어야 한다. 예) scanf("%d", &num); %d : 10진수 정수(서식문자) &num : 변수 이때, 입력받는 값을 저장하기 위해서는 할당된 메모리 공간을 지정해주어야 한다(10진수 정수, 변수 num에 저장하라고 했지만 변수 num이 어느 위치에 존재하는지 모르기 때문이다). 따라서 변수 num이 있는 메모리의 주소를 알려주어야 하는데, 이 때 사용하는것이 &(주소연산자)이다. 주소연산자를 통해 해당 변수 num의 할당된 메모리 공간이 주소를 알려주기 때문에 입력이 가능하다. 2018. 12. 17.
C언어 - int로 선언한 변수에 입력한 값을 char로 출력 할 경우 오류가 나는 이유. 1 2 3 4 5 6 7 8 9 10 11 12 13 #include int main() { int num; // int를 char로 고쳐주면 해결된다. printf("입력 값 : "); scanf("%c",&num); printf("\n"); printf("아스키 코드 : %d\n",num); return 0 ; } Colored by Color Scripter cs 입력 : A 출력 : -0515387999 쓰레기 값이 출력되는 이유는? num의 자료형이 int형 4바이트, 출력하는 값의 형식지정자는 %c(char)이다. int형 변수 num을 지정할 때, 초기화를 해주지 않았기 때문에 num에는 쓰레기 값이 들어가 있다. 즉, 4바이트 메모리 공간에 쓰레기값이 꽉 차있는것이다. 이 때, num에 값.. 2018. 12. 17.
C언어 - 배열과 스택, 버퍼 오버플로우 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include int main() char ch1[2]; char ch2[2]; char ch3[2]; printf( "문자 입력\n" ); scanf( "%s", ch1); // scanf의 오류때문에 scanf_s를 쓰는경우엔 'scanf_s("%s",ch1,버퍼의 크기);'와 같이 3개의 인자를 넣어주어야 한다. - _s가 오버플로우 현상을 잡기위해 만든것이므로 _s에선 오류가 발생하지 않는다. scanf( "%s", ch2); // scanf_s와 같이 _s를 쓰는 연산자는 설정에서 sdl체크를 해제해주면 _s없이 사용 할 수 있다. scanf( "%s", ch3); printf( "ch1 : %s .. 2018. 12. 17.
C언어 - scanf_s의 사용법과 예제 요즘엔 scanf의 사용을 금지하는 컴파일러가 많다(오류를 뿜뿜한다던가...). 보안상의 문제가 많다고 하니 scanf_s를 사용하길 권장한다. scanf_s는 scanf와 사용방법이 많이 다르지 않다. scanf_s에서는 scanf에서 아래와 같이 뒤쪽에 변수의 길이만 추가해주면 된다. scanf_s("서식문자 및 문자열", {변수}, {변수의 길이}) 예) scanf_s("%s",a,sizeof(a)); 사용 예) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include int main(void ) { char a[7]; int i=0; printf( "입력할 값은? : " ); scanf_s( "%s",a,sizeof (a)); /*.. 2018. 12. 13.