Backend 88

Segmentation Fault

다음 소스 코드를 보자. 이 코드에서 과연 에러가 날까? 1 : #include 2 : int main(){ 3 : int *p; 4 : 5 : *p = 1024; 6 : printf("%d\n", *p); 7 : return 0; 8 : } 이 코드는 중대한 문제점을 가지고 있다. p는 어떠한 번지를 저장할 수 있는 변수이다. 그래서 처음에는 어떠한 쓰레기 값이 번지로 들어가게 된다. (23984 라 가정하겠다.) 그런데 5번째 줄을 보면, 이 쓰레기 값이 주소인 곳 ( 23984 ) 에 1024를 넣으려 하고 있다. 이 코드는 실행했을 때에 아무런 에러가 없는 듯 보이지만, 만약 시스템에서 23984 라는 곳을 사용하고 있다면, "세그먼테이션 폴트"가 일어나게 되는 것이다. 이것은 다른 프로그램이 사..

Backend/C 2012.04.12

함수 인수로 사용되는 포인터

함수 인수로 사용되는 포인터 C의 매개변수 전달 방식은 "값에 의한 호출(call by value)"이다. 즉, 매개변수는 함수에 오직 한 방향으로 전달된다는 것이다. 함수의 유일한 결과는 하나의 반환값 뿐이다. 하지만, 포인터를 사용하면 함수의 결과를 반환값을 통하지 않고도 전달할 수 있다. C는 함수의 정보를 호출자로 넘길 수 있다. 아래의 소스 코드를 보자. 1 : #include 2 : void inc_count(int *count_ptr); //이 함수의 매개변수는 정수가 아니고 정수형 포인터이다. 3 : 4 : int main(){ 5 : int count = 0; 6 : while(count

Backend/C 2012.04.12

포인터(pointer)란 무엇인가?

포인터(pointer)란 무엇인가? C 프로그램에서 변수를 선언할 때 컴파일러는 변수를 저장하기 위해 유일하게 구분되는 주소의 메모리 영역을 할당한다. 컴파일러는 변수의 이름을 특정 주소에 연결시킨다. 주소 : 1000 1002 1003 1004 1005 - -- - - - - - 값 : 40 55 변수 : a b a와 b 라는 이름의 변수가 선언되고 각각 40, 55의 값으로 초기화 되었다. 그럼 포인터는 무엇일까? 예를 들어, int *p; 이라는 포인터형 변수를 선언해 보자. 이것은 int형의 어떤 변수를 가리킬 수 있는 포인터이다. 포인터 선언은 위와 같이 typename *ptrname; 의 형식으로 선언된다. 또한 포인터는 아래와 같이 일반적인 변수와 함께 선언될 수 있다. int *p , a..

Backend/C 2012.04.12

Call by value & call by reference

1 : #include 2 : void by_value(int a, int b, int c); //call by value : 값에 의한 호출 3 : void by_ref(int *a, int *b, int *c); //call by reference : 참조에 의한 호출 4 : void main() 5 : { 6 : int x =2, y = 4, z = 6; 7 : printf("\nBefore calling by_value(), x = %d, y = %d, z = %d.", x, y, z); 8 : by_value(x, y, z); //x, y, z는 지역변수 이기 때문에 main 내에서만 효과를 발휘합니다. 9 : printf("\nAfter calling by_value(), x = %d, y =..

Backend/C 2012.04.12

문자열의 길이를 계산하는 두 가지 방법

사용자 정의 함수를 만들어 주기 1 : #include 2 : 3 : int str_len(char *); 4 : void main(){ 5 : char buf[20]; 6 : puts("\nEnter a line of text: a blank line terminates."); 7 : gets(buf); 8 : int length = str_len(buf); 9 : printf("\nThat line is %u characters long.", length); 10 : } 11 : int str_len(char *p) //사용자 정의함수 12 : { 13 : int i = 0; 14 : while(p[i] != '\0'){ //문자열의 끝이 나올때까지 i 값을 증가시킨다. 15 : i++; 16 : }..

Backend/C 2012.04.12

argc, argv를 이용한 간단한 사칙연산.

1 : #include 2 : #include 3 : void main(int argc, char *argv[]){ 4 : int m = atoi(argv[1]); //argv[1]에 들어온 수를 m에 저장 5 : int n = atoi(argv[3]); //argv[3]에 들어온 수를 n에 저장 6 ; 7 : int j = *argv[2]; //argv[2]에는 부호가 들어감 8 : /*int j = argv[2][0]; 으로 해도 된다 */ 9 : int result; 10 : if(j == 43) //43은 '+'의 아스키 코드값 11 : result = m + n; 12 : else if(j == 45) 13 : result = m - n; 14 : else if(j == 47) 15 : resu..

Backend/C 2012.04.12

strcpy()함수

char *strcpy(char *destination, char *source); 함수 strcpy()는 source가 가리키고 널 문자를 포함하는 문자열을 destiation이 가리키는 곳으로 복사한다. 복귀 값은 새로운 문자열 destination 에 대한 포인터이다. strcpy() 를 사용할 때는 우선 목적 문자열을 저장하기 위한 영역을 할당해야 한다. 함수는 destination이 이미 할당되어 있는 영역인지 알 수 없다. 메모리 영역이 할당되지 않았다면 함수는 destination에서부터 시작해서 strlen(source)만큼의 메모리 영역을 덮어쓸 것이다. 이것은 에상할 수 없는 문제를 일으킬 수 있다. 1 : #include 2 : #include 3 : #include 4 : char ..

Backend/C 2012.04.12

Hello, World!

1 : #include 2 : void main(){ 3 : printf("Hello, World ! "); 4 : } 항상, 모든 C 언어 제일 첫 과에 나오는 코드이죠. 간단해 보이지만 저 4줄의 코드에는 많은 의미가 있답니다. 우선 첫번째 라인의 소스를 볼까요, #include 라고 표시되어 있습니다. include 는 영어 사전에서 찾아보면 "포함하다" 라는 뜻을 가지고 있습니다. 이 1번 라인에서는, "stdio.h라는 헤더 파일을 포함하라" 라는 의미가 되겠지요. 자, 그럼, stdio.h는 무슨 파일 일까요?? stdio.h의 stdio는 "standard input and output" 의 약자이고요, stdio.h는, "C에서 표준 입출력을 제공해주는 Library들이 모여있는 선언파일"..

Backend/C 2012.04.12

About C Language

Wiki 의 내용 벨 연구소에서 1971년경부터 리치(D.M.Ritchie) 등에 의해서 설계 개발된 시스템 기술용의 프로그래밍 언어이다. UNIX 오퍼레이팅 시스템의 기술에 사용할 것을 목적으로 설계한 언어로 UNIX OS의 대부분이 이 언어로 개발되었다. 컴퓨터의 구조에 밀착한 기초 기술이 가능한 것과 간결한 표기가 될 수 있는 것 등을 특징으로 하고 있다. 시스템 기술(記術)용 언어의 경우에는 기억장치의 주소(어드레스) 등과 같은 하드웨어 자원까지 기술(記術)의 대상으로 할 것을 요구하고 있는데, C언어에서는 이러한 수준의 개념을 데이터 형이나 함수 등의 고수준 언어의 개념에 잘 대응하고 있다. 따라서 언어의 성격상 일반적인 범용의 언어와 거의 다를 바가 없다. 프로그램을 다른 종류의 컴퓨터에 이식..

Backend/C 2012.04.12
반응형