리눅스 중 atoi 함수
#include 
#include 
#include 
int atoi(const char *string);
int myAdd(char *String);
int main(){
   //char *argv[] ={ "/bin/ls", "-al", "/tmp", NULL};
	char *argv;
	printf("first word : ");
	argv[0] = getchar();
	getchar();
	printf("second word : ");
	argv[1] = getchar();
	printf("%d",myAdd(argv));
// execl( "/bin/ls", "/bin/ls", "-al", "/tmp", NULL);
//   execv( "/bin/ls", argv);
//   printf( "이 메시지가 보이면 지정된 프로그램이 \
없거나 어떤 문제로 실행되지 못한 것입니다.\n");
}
int atoi(char const *c){
	int value = 0;
	int positive = 1;
	if(*c == '\0')
		return 0;
	if(*c == '-')
		positive = -1;
	while(*c) {
		if(*c > '0' && *c < '9')
			value = value * 10 + *c - '0';
		c++;
	}
	return value*positive;
}
int myAdd(char *String){
        int x, y;
        x = atoi(String);
	String++;
        y = atoi(String);
        return x + y;
}
위와 같은 c파일을 만들었는데, 첫번째 인수만 입력되고 프로그램이 죽습니다.
first word : '1'   
Segmentation fault (core dumped)
위와 같은 모습으로 죽습니다.
디버깅을 돌려보니
기능 메인에서 빠져 나올 때까지 단일 스테핑,
줄 번호 정보가 없습니다.
프로그램이 SIGSEGV 신호로 종료되었습니다. 세그먼트가 잘못되었습니다.
프로그램이 더 이상 존재하지 않습니다.
라는 오류가 나네요..ㅠㅠ


...
char *argv;
포인터만 있고 메모리 할당은 되지 않았어요.
디버깅 정보가 없는 건, 컴파일 할 때 -g 옵션을 안 주신 것 같군요. 개발할 때는 -g3 -O0 를 추가로 주고 컴파일 하세요.
참고해보세요.
구름 IDE 테스트
https://ide.goorm.io
#include <stdio.h> #include <stdlib.h> #include <string.h> int atoi(const char *string); int myAdd(char *String); int main() { //char *argv[] ={ "/bin/ls", "-al", "/tmp", NULL}; //test int height = 6, width = 8; char **arr; arr = (char**) malloc ( sizeof(char*) * height ); for(int i=0; i<height; i++) { arr[i] = (char*) malloc ( sizeof(char) * width ); sprintf( arr[i], "test%d", i); printf("%s\n", arr[i]); free(arr[i]); } free(arr); //생성 arr = (char**) malloc ( sizeof(char*) * height ); for(int i=0; i<height; i++) { arr[i] = (char*) malloc ( sizeof(char) * width ); sprintf( arr[i], "test%d", i); printf("%s\n", arr[i]); // free(arr[i]); } // free(arr); // printf("first word : "); int n = getchar(); printf("%d %c %x\n", n, n, n); sprintf( arr[0], "%c", n); printf("arr[0] %s\n", arr[0]); //한칸 띄우기 putchar(getchar()); // printf("second word : "); n = getchar(); sprintf( arr[1], "%c", n); printf("arr[0] %s\n", arr[0]); printf("arr[1] %s\n", arr[1]); //한칸 띄우기 putchar(getchar()); printf("arr : %s\n", *arr); printf("arr[0] : %s\n", arr[0]); printf("arr[1] : %s\n", arr[1]); // printf("%d", myAdd((char*)arr)); //소멸 for(int i=0; i<height; i++) { free(arr[i]); } free(arr); return 0; // execl( "/bin/ls", "/bin/ls", "-al", "/tmp", NULL); // execv( "/bin/ls", argv); // printf( "이 메시지가 보이면 지정된 프로그램이 \ //없거나 어떤 문제로 실행되지 못한 것입니다.\n"); return 0; } int atoi(char const *c) { int value = 0; int positive = 1; if(*c == '\0') return 0; if(*c == '-') positive = -1; while(*c) { if(*c > '0' && *c < '9') value = value * 10 + *c - '0'; c++; } return value*positive; } int myAdd(char *String) { char ** p = (char**) String; printf("p[0] : %s\n", p[0]); printf("String0 : %s\n", String); int x, y; x = atoi(p[0]); printf("x %d\n", x); String++; printf("\n"); printf("p[1] : %s\n", p[1]); printf("String1 : %s\n", String); y = atoi(p[1]); printf("y %d\n", y); return x + y; }//출력 결과
root@goorm:/workspace/ccc/src# gcc -o m main.c
root@goorm:/workspace/ccc/src# ./m
test0
test1
test2
test3
test4
test5
test0
test1
test2
test3
test4
test5
first word : 4
52 4 34
arr[0] 4
second word : 7
arr[0] 4
arr[1] 7
arr : 4
arr[0] : 4
arr[1] : 7
p[0] : 4
String0 : P
x 4
p[1] : 7
String1 :
y 7
11
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
atoi 함수를 일부러 만든 건가요?
atoi 함수를 일부러 만든 건가요?
표준함수를 안 쓰고?
소스코드에 들여쓰기 적용하려면
https://kldp.org/node/158191
참고하셔요.
컴파일할 때 에러와 경고를 자세히 보려면
gcc -Wall
해 보셔요.
세벌 https://sebuls.blogspot.kr/
댓글 달기