배열과 포인터가 어떻게 작용하나요?
글쓴이: 훌륭한녀석 / 작성시간: 금, 2004/03/26 - 2:18오후
모듈 프로그래밍을 하다가 제가 생각했던것과는 좀 다른 경우를 발견해서 제가 모르고 지나간것이 있는가.. 해서 질문을 드립니다.
일단 모듈부분을 보시면
#ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE #define MODULE #endif #define EXPORT_SYMTAB #include <linux/autoconf.h> #if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) #define MODVERSION #endif #if defined (MODVERSIONS) && (__GENKSYMS__) #include <linux/modversions.h> #include "module1.ver" #endif #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/string.h> char* m=NULL; /* char m[]="add"; */ int n = 0; MODULE_PARM(m,"s"); MODULE_PARM(n,"i"); static void my_list_add(int); static void my_list_remove(int); static int my_init(void); static void my_exit(void); module_init(my_init); module_exit(my_exit); static int my_init(void) { printk("module2 loaded\n"); if(!strncmp("add",m,3)){ // add my_list_add(n); }else if(!strncmp("del",m,3)){ // delete my_list_remove(n); }else{ printk("argument need\n"); } return 0; } static void my_exit(void) { printk("cleanup_module2\n"); }
보시는 바와 같이 EXPORT를 이용한 모듈사이의 심볼의 공유(?)를 하는 부분입니다.
문제는 parameter값을 문자열로 읽어들이는데, 처음에는 char* m 의 형식으로 주었는데 문제가 없었습니다.
그런데, 다른 사람이 만든 소스에는 char m[]="add" 이런식으로 초기값을 주었는데 문제는 파라메터 값으로 다른값을 줘도 그 문자열을 받아들이지 못하고 항상 add라는 스트링으로 strncmp를 하는 모습을 보았습니다. 그래서 del을 하던 add를 하던 항상 add만을 실행하는 기이한 모습..
뭐가 문제였을까요?
Forums:
이게 맞는진 모르겠지만..
char m[] = "add" 라고 할 경우에는 m 이란것은 const 로써 "add"가 저장된특정한 곳을 가리키고 변경될수 없습니다. 하지만,
char *m 이라고 하면 m 은 메모리의 어떠한 영역도 가르킬 수 있습니다.
그래서 훌륭한님이 보신 그러한 결과가 나오지 않았나 짐작합니다. ^^
포인터.
위의 소스에서는 m에 NULL을 넣은상태에서
"add"랑 비교하는 부분밖에 나타나지 않으니
위의 내용만으로는 알 수 가 없겟네요.
안되는 소스를 올려보세요.
님께서 말씀하신대로 del 를 넣었는데도 add쪽 루틴을 타는
소스를 올려보신다면 무엇이 문제인지 알기 쉽겠죠.
참고로 char m[] = "add" 에서 m은 "add"를 가리키는 주소가 아닙니다.
반대로 m이 가리키는 주소에 "add"라는 문자열을 복사하는 것이라 볼
우 있습니다. 저도 마찬가지지만 포인터와 주소는 얼핏 보면 참 헷갈리는
부분이 많은것 같습니다. 실수 할때도 많고요.
그렇다면 char * const m이 되었겠군요.그리고 MODULE_
그렇다면 char * const m이 되었겠군요.
그리고 MODULE_PARM(m,"s"); 이 매크로에서는 바로 스트링을 변경하지 않고 포인팅을 변경하겠군요.
그래서 그런 상황이.. ^^;
감사합니다.
----
훌륭한녀석!!
댓글 달기