문자열 함수를 구현하는 와중에
char* str =NULL;
strlne(str);
이라고 입력하면 메모리 오류가 나는데
NULL==0은 같으니
0번지를 역참조해도 0번지 부터 4바이트 읽어오는것이 아닌가요??
왜 에러가 나는거죠 ?
문자열 함수를 구현하는 와중에
char* str =NULL;
strlne(str);
이라고 입력하면 메모리 오류가 나는데
NULL==0은 같으니
0번지를 역참조해도 0번지 부터 4바이트 읽어오는것이 아닌가요??
왜 에러가 나는거죠 ?
네 포인터 주소를 0번지로 할당하는건데 1000번지로 할당해서 1004번지 까지 읽나 0번지로 할당해서 4번지 까지 읽나 같지 않냐는 질문입니다.
같이 4바이트 읽어들여서 표현하는건데 0번지 부터 읽는것은 왜 에러가 나는가가 궁금했습니다.
으잉 글을지우셧넹
포인터 주소는 기본적으로 1227730 막 이런 정수형 숫자거나 아니면 0이거나 둘중 하난데 0은 실제로 어떤 메모리상의 위치를 가르키는게 아니라고 알고있음요
아니지. 해당 주소에 0이 있어야 널 스트링이지 저건 0번 주소를 넣은 거니 의미가 다름
그게 어떤건지 검색해도 잘안나와서 그러는데 설명이나 설명이 나와있는곳을 링크 해주실수 있습니까 ㅠ? 궁금해서욥
char* str = {0}; 이렇게 선언하면 되려나
하여간 저거는 말이 안됨요 포인터 주소 자체는 다른 값을 할당할 수 없음
guest5//형 무슨말인지 모르곘어요
아니면 char* str; *str = 0; 이런식으로 역참조를 통해서 값을 할당하거나
http://ccpro.tistory.com/27
링크 찾아서 알려주는데 혼자 연구하는 C 라는 책 내용을 베껴놓은 블로그인가보다
char* str = {0}; <<이렇게 선언하면 str은 실질적으로 0이 들어간 곳에 시작주소를 닮고 있는거잔아요? 그렇게 작성하면 에러는 안뜨는데 char* str = 0 printf("%d",*str); 이런식으로 하면 왜 에러가나는지가 구체적으로 설명이 듣고싶었어영
NoOTL//감사합니다 읽어보겠습니다.
guest5 님은 네가 길이가 0인 문자열을 선언하려 했다 생각하신 듯
NoOTL//감사합니다 원하던 내용이였습니다.
검색은 구글에서 포인터 0 이라고 검색하니까 나왔어요.
나도 구글에 NULL포인터라고 검색했는데 못찾았는데 ㅠ 좀더 검색실력을 향상시켜야겠어요
프로세스가 메모리에 올라갈 때 4GB 메모리가 섹션인가 그런걸로 나눠져서 올라감. 스택, 힙, 코드 섹션 등등 여러가지 있는데 각자 정해진 범위가 있고. 주소값 NULL(0으로 정의된 값) 이게 메모리 섹션 범위를 벗어나서 에러를 띄우는것 같은데
전에 시스템과목 들으면서 배운 내용이었는데 자세히 기억안나네
http://soen.kr/
그러고보니 여기가 혼자 연구하는 C
컴파일러가 0 포인터를 실제 0번지로 설정할지 다른걸로 설정할지는 자유임. 그냥 다른 존재하지 않는 메모리 주소로 할수도 있음.
ㅍㅋ,d// 감사합니다 두분다 도움이 되었습니다. 참고해야겠네요
그냥 단순한 이유야. 0번지에 메모리가 없어서 오류가 난 거야. 약간의 트릭을 쓰면 NULL 포인터 참조해도 값 읽어지게 할 수 있음. 32비트 시절에 윈도우의 VirtualAlloc API에 높은 주소 값을 할당하도록 해서 0x00000000 번지에 메모리 할당하는 트릭이 실제로 존재했었다. 지금은 되는 지 모르겠음. 적어도 윈도우 XP까지는 유효했던 방법임.
그리고 NULL == 0은 암묵적인 표준이다. 포인터에 다른 정수 값을 그냥 넣으면 컴파일러가 오류를 내뱉는데 숫자 0은 특별 취급해서 오류를 안 내뱉는 건 숫자 0을 NULL로 받아들이기 때문임. (예: float *ptr = 0;)
지나치게 표준을 의식하는 사람은 NULL이 0번지가 아닌 환경이 존재하지 않겠느냐라고 반문할 수 있지만 지금까지 그런 환경은 없었거니와 NULL이 0이 아닌 환경을 만드는 거 자체가 애초에 비효율적인 거임.
그리고 0번지를 NULL의 의미로 쓰는 데에는 역사적인 이유도 존재함. 간단히 설명하면 옛날에는 물리 메모리(RAM) 0번지에 대빵 중요한 시스템 값들을 넣어놨는데 이걸 일반 프로그램이 쓸 일은 없기 때문에 "접근 금지"의 개념으로 무효 포인터를 0번지로 쓰게 된 거임. 가령 인텔 16비트 CPU 시절엔 물리 메모리 0번지에 IVT(Interrupt Vector Table)이 들어있었지. 인터럽트가 발생하면 처리할 함수 주소들을 보관하는 매우 중요한 공간.
--- 위에 윈도우에 존재했다는 트릭. 프갤에 올리려고 다시 찾아보니 높은 주소를 이용한 게 아니라 Page Boundary를 이용한 트릭이었네.
기억에 왜곡이 생긴 듯 :p 어쩌면 ZwAllocateVirtualMemory에 0xffffffff(NtCurrentProcess) 값 넘기는 걸 오해한 걸지도. 중딩 때 본 트릭이니깐.
내말을 잘못 이해한듯. NULL 도 0 도 둘다 널포인터 상수라 NULL == 0 은 암묵적인게 아니고 명시적 표준임. 내가 말한건 C 프로그래머가 아니라 컴파일러 구현자 입장에서 널포인터를 0 번지로 할건지, 다른 이상한 주소로 만들어 하드웨어 익셉션같은걸 이용할건지가 자유라는거. 물론, 다른 이상한 주소로 한다 해도 NULL == 0 는 성립되어야 함. 위에서 무슨 0번지를 읽어오네 어쩌네 해서 쓴거임.
d// NULL==0이니까 *str 하면 0번지를 역참조하게되는거잔아요 그래서 0번지를 읽어오네라고 적었습니다.
ㅅㅅㅅ// 아하 그렇군요 면접때 물어보면 저렇게 대답하면되겠다 ㅋㅋ 감사합니다
http://autogram.tk/이
중고차 어플리케이션 어떤가요?