C언어)포인터 함수 인자 받아오는 중 오류
글쓴이: 하요미 / 작성시간: 화, 2014/09/16 - 11:30오전
이번에 키생성하는 유틸리티를 만들게되었습니다(콘솔)
그런데 제가 포인터가 아직 머릿속에 콕 안박혀있는지 헷갈리고 이것저것 써보게되네요 하..
일단 키타입이 무엇인지 그리고 키 크기몇인지를 받아와 if문을 걸어 키를생성하는 함수를 돌려서 프로그래밍ㅎㅏ려고하는데여
그 받아오는 과정이 막혀서 진행이안되고있습니다.
디버깅을 잡아보니 Key_Size(char *kt) 함수에서 인자값을 받아오지못하는 현상을 발견하였습니다.
전체소스입니다.
#include<stdio.h> #include<stdlib.h> #include<string.h> char* Key_Type() { char Key_t[100]; //100이라고 준이유는 10줬더니 입력을 10글자이상하니까 런타임오류가뜸 . 프로젝트가 죽어버림 (이거에대한 질문 맨 아래에) //char *k_ptr; //k_ptr = &Key_t[0]; memset(&Key_t[0], 0, 100); //Key_t배열을 0으로 초기화. printf("Key type? (AES, ARIA, HMAC) // [default ARIA] > "); //키타입뭘로할꺼니? gets(Key_t); // 입력받는다. if(!strcmp(Key_t, "AES")) //같으면0, 0이 아니니까 참 { return Key_t; //AES 반환 } else if(!strcmp(Key_t, "ARIA")) { return Key_t; } else if(!strcmp(Key_t, "HMAC")) { return Key_t; } else { printf("Error. Please select correctly.\n"); // 위 세개중에 입력하지않으면 exit(-1); // 강제종료 } } int Key_Size(char* kt) // Key_type의 반환값을 kt 인자값으로 받아옴. 그니까 AES였다면 AES를 받아와야함. 그런데 이상한 쓰레기값이 들어있고 받아오질않음 { int Key_s = 0; if(!strcmp(kt, "AES")) // 만일 AES를입력했엇다면 { printf("Key Size? (128, 192, 256) // [default 256 bits] > "); //키 사이즈 몇으로 할꺼냐? gets_s("%d", Key_s); // if(Key_s!=(128 || 192 || 256)) { printf("Error. Please select key size correctly"); exit(-1); } } else if(!strcmp(kt, "ARIA")) { printf("Key Size? (128, 192, 256) // [default 256 bits] > "); } else if(!strcmp(kt, "HMAC")) { printf("Key Size? (128, 160) // [default 160 bits] > "); } } int main() { char *key_type[10]; //키타입 함수에서 반환값 받을 .. int key_size; char *key_ptr; //무용지물 memset(&key_type[0],0,10); //key_ptr = &key_type[0]; key_ptr = *key_type; *key_type=Key_Type(); Key_Size(*key_type); //Key_Size(key_ptr); return 0; }
고수님들... 이건딱히 고수가아니여도 할수잇을것같지만 제 머리가 딸려서 꼭좀 이해좀시켜주세요 ㅠ_ㅠ 부탁드립니다!
그리고 Key_type 함수에서 입력받을 배열 Key_Type[100] 으로 준거요 100글자이상치면 런타임 오류나는데 이거 없이 오류를잡아내고
오류라고 간단하게 프린트문찍고 exit(0) 해줄 방법은없을까요?
감사합니다.
Forums:
고쳐야할점이 몇몇보이는군요.
일단 가장 눈에보이는 오류는
return Key_t;
이부분입니다.
Key_t는 지역변수입니다.
함수내에서 생성되고 함수가 종료되면 같이 할당이 풀립니다.
그런데 함수에서 생성한 배열변수의 주소를 리턴해줘버리면, 그 주소는 함수의 종료와 함께 할당이 풀리기때문에 제대로된 결과를 반영하지 못합니다.
이 경우는 배열을 동적할당으로 받아와서 그 주소를 리턴해주면 해결됩니다.
말씀하신 런타임오류는 gets 함수로는 해결이 되지 않습니다. gets함수가 구식함수이기도하고 안전성에 문제가 있기 때문이죠.
key_size 함수에서 사용하신 gets_s 함수를 쓰셔야할것 같네요.
친절한 답변감사드립니다.
이번엔 size값을 받아오는게안되서 몇시간째 헤매다가 다시 봤더니 &를 안붙엿더라고요 이런 사소한거를 지나치고 다른데서 찾으려고했다니
어쩃든 답변감사드립니다 다음에도 또 답변해주세요! 감사합니다!
≪지금이 너무 힘들면 잘하고 있는 것이다.≫
댓글 달기