이런 문제는 어떤 문제인가요?
글쓴이: mabux / 작성시간: 금, 2004/08/27 - 4:25오후
dmesg 명령어로 확인하는데..
unable to handle kernel NULL pointer derefrence at virtual address 000000da
라는 문구가 눈에 들어오네요..
드라이버 화일 하나 수정하여 모듈 올리고 write하는 부분 테스트를 하였는데.
write부분에서 아마도 먹통이 되는 듯 싶습니다..
write관련 부분 코드도 추가해 봅니다.
char data[10];
data[0] = (char)"0x11";
write(*data, buffer, 0x10, 0);
위의 코드이고 경고 발생합니다.
경고 문구는 "make pointer from integer without a cast"
integer 변수를 사용을 안함에도 불구하고 위와 같은 경고 문구가 나오네요.
그리고 write의 원형은
write(struct file *file, const char *buffer, size_t count, loff_t *ppos);
입니다.
그럼 답변 부탁드리겠습니다.
Forums:
[code:1]char data[10]; dat
두번째 줄이 이상하군요. "0x11"이라는 문자열 상수를 가리키는 포인터 주소값을 char 형(정수형)으로 형변환 해서 char형 배열의 한 원소에 저장하는 건 아무런 의미가 없습니다.
세번째 줄도 마찬가지... 올려주신 대로라면 write 함수의 첫번째 매개변수는 file 구조체에 대한 포인터가 되어야 하겠죠.
[code:1]char data[10]; data&
일단 경고 문구 없이, 그리고 바른 코드는...
write((struct file *)data, buff, 0x10, NULL);
뭐... 이정도가 되지 않나 생각이 드는군요.
분명히 write() 함수에서 1,2번째 인자가 pointer인데도 정작 넘겨준건 char 값이니깐 당연히 에러가 납니다.
그리고 0하고 (loff_t *) 0 이건 명백히 틀린 값입니다.
하나는 상수이고, 하나는 포인터 주소이고.
아직 C에서는 이러한 혼용을 허용하지 않는것으로 알고 있습니다.
C++에서는 특별히 확인을 하지 않는 글을 본적은 있는거 같은데...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
[quote="서지훈"]그리고 0하고 (loff_t *) 0 이건 명백히
아직이 아니라 C가 세상에 나왔을 때부터 그렇게 써오고 있는데... :cry:
정확하게 얘기하자면 함수 원형이 있어야 합니디만, 함수 원형 선언 없이 함수를 호출한다는 것은 실제 프로그램에선 거의 있을 수 없는 일이기 때문에 논외로 하겠습니다.
한국 BSD 사용자 포럼
[quote="서지훈"]그리고 0하고 (loff_t *) 0 이건 명
C에서도 0은 null pointer constant 입니다. 포인터 변수에 대한 0의 대입, 0과의 비교 모두 허용되고 있으며, 널 포인터 변수의 내부적인 표현이 "모든 비트가 0"이 아닌 환경이라 할지라도 0과 비교했을 시엔 무조건 1이 나오도록 되어 있습니다. 몇몇 C 컴파일러에서 NULL 매크로 상수로 ((void *)0) 식으로 정의해 놓는 것은 프로그래머의 실수를 방지하기 위해서 입니다.
또한 C++에서는 (void *)형에서 다른 포인터 형으로의 암시적인 형변환이 금지되어 있기 때문에 오히려 NULL은 보통 0으로 정의되며, 책에 따라서는 널 포인터 상수가 필요할 때 NULL 대신 그냥 0을 쓰는 것을 권장하기도 합니다.
댓글 달기