C언어 더블포인터 질문해봅니다 ^^;
알고리즘 교재를 보는데 ar4가 문제가 없다고 나오더라구요..
스트링은 문자열을 가리킬 수 있으니 더블 포인터로도 문자열들의 시작주소를 알 수 있지 않은지;
문자열이 정적 데이터 영역에 저장되기 때문인가요..
교재상으로는..
---본문---
위의 arr4 앞에는 별이 두개나 붙었다. 이것이 바로 포인터의 포인터의 정의 방법인데 그 내용으로는 문자열들의 나열이다. 이것들이 어떻게 메모리를 차지하는지를 알면 왜 포인터의 포인터가 사용되는지 알수있을 것이다..
아래 그림에서 사용한 주소들은 편의상 저자가 임의로 붙임 주소임을 알려둔다.
(arr4의 주소는 40이고 이 안에는 30이라는 숫자가 들어있네요.. 이게 주소30을 가리키게 해놓고.. 주소 30, 32, 34, 36은 각각 문자열의 시작 주소를 가르키구 있구요 Cat부터 문자열은 10이라는 주소부터 시작하네요.. 좀 시간이 지난 책이라 int*를 2바이트로 본 것 같습니다..)
Cat, Dog 같은 문자열들은 ??주소부터 차곡차곡 저장되어 있으며 각각은 \0 로 구분되어 있다. 그리고 각 문자열의 선두번지는 30이라는 주소부터 연속적으로 저장이 되어 있다. 즉 30부터의 내용은 포인터의 배열이 되는 것이다. 이 포인터의 배열의 선두 번지를 가르킬 arr4는 30이라는 주소를 가지며 이 30은 10을 가리키는 포인터이다. 즉 arr4는 포인터를 가리키는 포인터, 즉 포인터의 포인터 인 것이다.
----------
It occurs errors.
(Sorry for writing in English)
int _tmain(int argc, _TCHAR* argv[])
{
char** ar4 = { "abc", "def", "ghi", "jkl"};
return 0;
}
I just have tried this via VS2008 and it has occurred errors.
One of them is "cannot convert from 'const char [4]' to 'char **'" and I think this is natural.
--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?
--
음...
VS 에서는 char 의 타잎 형변환및 선언이 워낙 모호하니까 안되는 것 같은데
컴파일러에 따라서 char **ar4 를 char [4][] ar4 로 인식해주는 경우가 있을 것 같긴 합니다...
C++ 이었던가 C# 이었던가 저도 저렇게 쓴 기억이 있네요... 물론 좋지 않은 경우라서 나중에 다 [] 로 바꿔줬지만...
-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr
iostream을
iostream을 포함시킨거보면,
c++인데요 요 녀석은 타입체크가 엄격하니까 문제가 발생하겠죠.
그리고 비쥬얼 스튜디오는 소스파일 확장자에 따라서 c 또는 c++로 컴파일 하게 되어 있으므로,
c확장자에 stdio.h 등을 이용해 보면 문제가 없을 것 같네요.
-----------------
한글을 사랑합니다.
-----------------
한글을 사랑합니다.
C확장자로 컴파일해봤는데요..
여전히 오류가 뜨네요. T.T
warning C4047: '초기화 중' : 'char **'의 간접 참조 수준이 'char [4]'과(와) 다릅니다.
error C2078: 이니셜라이저가 너무 많습니다.
음, 안되는 게 정상 아닌가요?
안되는 게 정상이고 책이 틀린 것 같은데요. 뭐 C 표준에 가끔씩 괴상한 게 섞여있으니까 100% 장담은 못하겠습니다만...
이상한데요..
#include //stdio.h
int main(int argc, char** argv, char** envp)
{
int i;
char* ar1="Hello";
char ar2[] = "hello";
char* arr3[] = {"Cat", "Bag", "Kas", "Zzd"};
char** arr4 = {"Cat", "Bag", "Kas", "Zzd"}; //warning
for(i =0; arr4[i]; i++) printf("%s\n",arr4[i]); //error
for(i =0; envp[i]; i++) printf("%s\n",envp[i]);
return 0;
}
더블포인터 하면 문자열배열 저장할수 있는데
대입방법이 잘못됬나봅니다
저같은 경우는;
책이 잘못되었다고 생각했거든요.
더블 포인터라는것 자체가 포인터 변수를 가르키는 것인데
문자열 자체는 상수이고 정적 데이터 영역에 저장되니까
그 정적 데이터 영역을 가르키는 포인터가 있거나
이러한 문자열을 저장할 수 있는 배열이 있어야 성립한다고 생각했는데..
그런 말씀들이 없는거 보니까 제가 번지를 잘못 짚은것 같네요 ㅠㅠ..
#include <stdio.h> int
결과
= {...}
는 배열의 initializer이기 때문에 포인터에는 쓸 수 없는 것 같습니다.
이와는 다르게 문자열은 문자배열의 초기화에 사용할 수 있고,
문자포인터의 초기값 혹은 코드 중간에 대입도 가능합니다.
표준에 어찌 나와있는지는 내일 찾아보고 다시 써보겠습니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
음...
ar4 는 쓸 수 없을텐데요...
char *ar3[] 는 char * 타입의 element 를 가진 배열이기 때문에.. 문자열 배열을 할당할 수 있지만..
char **ar4 는 배열이 아닌 변수이기 때문에 사용할 수 없습니다.
더블 포인터에 문자열 배열을 저장하려면 char * 타입의 배열 크기만큼 동적으로 메모리를 할당한 다음..
하나씩 assign 해 줘야 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기