본문 바로가기

OS/Linux13

[Linux/C] 배열은 포인터다! 비교 조건 \ 비교 대상 포인터 배열 이름 있음 있음 나타내는것 메모리 주소 메모리 주소 변수인가 상수인가 변수 상수 * 배열 이름은 = 상수 포인터이다. arr ==> 주소를 나타내고 해당 주소를 ptr에 넣어주므로 arr과 ptr은 같아진다. 주소를 나타내므로 포인터의 연산 해당 포인터의 선언된 타입에 따라 증감하면 해당 바이트 크기만큼 증감된다. arr[ i ] == *(a+i) 으로 나타낼수있다. 문자열은 문자열 배열은 변수이고 ==> char str1[5] = "abcd"; -> 변수 str1 문자열 문자는 상수이다 ==> char *str1 = "abcd"; -> 상수 *str1 또한 문자열 상수의 경우는 "두개의 문자열 상수가 완전히 똑같을 경우" 문자열은 한개의 메모리 공간에 저장되고, 두.. 2022. 9. 13.
[C/Linux] 배열의 선언 배열을 선언할때 초기화를 바로 해주면 해당 배열의 크기를 지정해주지 않아도 해당 초기화를 통해서 배열의 크기가 정해진다. int arry[] = {1,2,3,4,5}; 로 선언과 동시에 초기화 하고있으므로 int arry[5] = null; arry[0] = 1, arry[1] = 2, arry[2] = 3, arry[3] = 4,arry[4] = 5 와 동일하다. 또한 C언어에서는 arr.length 라는 함수가 없으므로 arry 의 size를 구하여 해당 int 타입의 size로 나눠주면 해당 배열의 길이를 파악할 수 있다. sizeof(arry) / size(int) 문자열 배열같은 경우는 char[] 로 나타낼수 있다. 또한 해당 문자열을 나타낼 떄는 %c를 통해소 char문자 한개 한개 요소를 .. 2022. 9. 12.
[C/Linux] static 변수 static 변수는 초기화를 1번만 실행한다. 따라서 int val =0; 일떄와 static int val = 0;일떄의 결과는 달라진다. val = 0 일경우는 지역변수로서 for문을 돌면서 fac()가 5번실행되는데 val = 0; 초기화후 val++ 후 val출력(1) 다시 val = 0 초기화 되기 떄문에 1 1 1 1 1 이 출력된다. static int val = 0;인경우는 static 변수는 지역변수더래도 해당 블록내에서 전역변수처럼 사용되기 때문에 0으로 초기화되지 않고 1씩 증가하여 1 2 3 4 5가 출력된다. 2022. 9. 10.
[Linux/C] 파일 입출력1-1(표준입출력) 입출력 함수에 대해서 알아보자. 한문자씩 읽고 쓰는 함수로 getchar() // putchar() 가 있다 getchar() 함수의 경우는 입력대기상태로 있다가 키보드로 부터 입력을 받으면 1문자가 c에 저장되고 이때 문자는 아스키 코드 값으로 int 값으로 저장된다. putchar() 함수에 의해서 c (1문자)를 출력해준다 console에 문장 단위로 읽고 쓰는 함수로 gets() // puts() gets() : Enter 키를 누르기 전까지 공백을 포함한 모든 문자열을 입력받는다 puts() : 문자열을 화면에 출력하고 , 자동으로 줄바꿈을 실시한다. ++ 추가해서 보면 좋을 블로그 https://blog.naver.com/vjhh0712v/221481858395 2022. 5. 25.
[Linux/C] 파일 입-출력2 파일 입출력의 기본적인 패턴 - 1. 파일을 연다(여는 옵션이 있다) 읽기모드(r), 쓰기모드(w), 추가모드(a) - 사용되는 함수는 fopen("파일이름/(즉)경로","사용 할 모드"); - 2.파일을 읽거나 쓴다 - 사용되는 함수는 읽기(fread() 등..) 쓰기 (fprintf() 등..) - 3. 읽거나 쓴 파일을 닫는다 - 사용되는 함수는 fclose() 표준 입출력 2022. 5. 25.
[Linux/C] Makefile Linux 에서 컴파일을 할때 gcc 를 통해서 컴파일을 진행했다 gcc 의 옵션들을 사용해서 컴파일 했었는데 옵션으로 -c : 의경우는 .c 파일을 통해서 ~~.o 인 오브젝트 파일을 만들때 사용했었다 ex) gcc -c main.c --> main.o 가 생성됨 // 동일한 방법으로 gcc -c -o main.o main.c --> main.c 파일을 통해 main.o 파일을 생성하였다 -o 옵션으로 원하는 파일명으로 만들수 있다 gcc main.c 의 경우는 a.out 이라는 이름의 실행 파일이 생성되어 진다. gcc -o test main.c 의 경우는 test 라는 이름으로 실행 파일이 생성되어 진다. 여러개의 파일을 묶어서 컴파일 할경우는 소스파일들을 나열하여 진행했다 gcc main.c su.. 2022. 5. 19.
[C/Linux] 헤더 파일 헤더 파일에 앞서 빌드란... 소스코드가 전처리-> 컴파일 -> 어셈블 -> 링크, 단계를 거쳐서 실행파일이 생성되는 것을 말한다. 보통 gcc 컴파일러를 통해서 컴파일을 하면 gcc -c main.c --> 를통해서 오브젝트 코드인 main.o 파일을 생성할 수 있다 gcc -o [test] main.c --> 를 통해서 바로 실행파일인 a.out 또는 test 파일을 생성할 수 있다. 컴파일을 통해서 .o (오브젝트 코드)를 생성한다음에 여러개의 오브젝트 파일을 묶어서 실행파일을 만들 수 있다. gcc -o test main.o sum.o double.o --> test라는 실행파일이 생성된다. -----------------------------------------------------------.. 2022. 5. 16.
[Linux/C] GDB GDB의 경우 Linux 로 컴파일 한것을 디버깅할수 있을 도구로 gcc -g [파일명] 을통해서 디버깅 할수 있도록설정한다음 gdb [컴파일한 파일명] 을 통해서 GDB로 접속한다. 기본적인 명령어로서 disas main : main() 함수에 적혀있는 함수를 어셈블리 언어로 확인할 수 있다. l : 코드를 10줄 보여주며, l을 누를때마다 10줄씩 보여준다. b : break point를 찍는 명령어로써, 코드를 실행시에 멈추게 되는 부분이다. r : 코드를 진행시킨다. Break Point 가 체크되어 있다면 해당 Break Point 에서 멈추게된다. n : 한줄을 실행 시키는 명령어로써 함수가 있을경우 해당 함수를 실행시키면서 한줄을 넘어가게된다. (해당 함수 안에 들어가서는 n키를 사용하는게 .. 2022. 3. 25.
[Linux/C] 함수 포인터 우선 말하고 싶은 것은 함수도 결국 메모리에 저장되고, 저장된 메모리 주소를 함수명으로 저장한다고 말할 수 있다. 아래의 실행결과와 코드를 보면 우선 함수 포인터 *fp를 선언하였고 (반환형 void, 매개변수 없는) 해당 함수포인터에 test함수의 주소를 저장하였다. 이떄 fp,test의 주소와 데이터를 확인해보자 test함수가 저장되어 있는 메모리주소의 시작점이 -472358470이 나왔고, 함수형 포인터에 저장되어 있는 값또한 -472358470이 나왔다. 즉 함수형 포인터 안에, 이미 선언되어있는 test함수의 시작 주소가 저장되었고 fp포인터 자체의 메모리 주소는 2084418384가 나온것을 확인 할 수있다.(배열과 동일하게 함수의 값과 포인터 값을 동일 test, *test값이 동일했다.) .. 2022. 3. 24.
[Linux/C] 포인터 리눅스의 꽃 포인터 int * char * float * double * short * 를 sizeof 하여 보면 8byte가 나오게 되는데 이것은 컴퓨터 구조에 영향이 있다. 32bit 컴퓨터는 포인터가 4byte이다. 32bit 컴퓨터는 램을 4기가 이상 못 꼽는다. 각 주소번지마다 1:1 매칭이되야함 (랜덤엑세스) 왜다 8byte로 나오냐 ? --> 결국 포인터에 저장되는것은 메모리 주소 값이 저장된다. 64비트 컴퓨터의 경우는 8바이트의 주소값이 나오게 되므로 해당 주소를 수용할 수 있는 8byte가 나오게된다. 해당 내용의 결과값을 가지고 그림으로 설명해보자. 그림을 말로 설명해보자 가장먼저 int a= 3; 을 통해서 메모리 주소를 a로 정의하고 해당 주소에 3을 대입하였다 printf("a .. 2022. 3. 23.