C언어 더블포인터 질문해봅니다 ^^;

tk3829의 이미지

알고리즘 교재를 보는데 ar4가 문제가 없다고 나오더라구요..

스트링은 문자열을 가리킬 수 있으니 더블 포인터로도 문자열들의 시작주소를 알 수 있지 않은지;

문자열이 정적 데이터 영역에 저장되기 때문인가요..

교재상으로는..

---본문---
위의 arr4 앞에는 별이 두개나 붙었다. 이것이 바로 포인터의 포인터의 정의 방법인데 그 내용으로는 문자열들의 나열이다. 이것들이 어떻게 메모리를 차지하는지를 알면 왜 포인터의 포인터가 사용되는지 알수있을 것이다..
아래 그림에서 사용한 주소들은 편의상 저자가 임의로 붙임 주소임을 알려둔다.
(arr4의 주소는 40이고 이 안에는 30이라는 숫자가 들어있네요.. 이게 주소30을 가리키게 해놓고.. 주소 30, 32, 34, 36은 각각 문자열의 시작 주소를 가르키구 있구요 Cat부터 문자열은 10이라는 주소부터 시작하네요.. 좀 시간이 지난 책이라 int*를 2바이트로 본 것 같습니다..)
Cat, Dog 같은 문자열들은 ??주소부터 차곡차곡 저장되어 있으며 각각은 \0 로 구분되어 있다. 그리고 각 문자열의 선두번지는 30이라는 주소부터 연속적으로 저장이 되어 있다. 즉 30부터의 내용은 포인터의 배열이 되는 것이다. 이 포인터의 배열의 선두 번지를 가르킬 arr4는 30이라는 주소를 가지며 이 30은 10을 가리키는 포인터이다. 즉 arr4는 포인터를 가리키는 포인터, 즉 포인터의 포인터 인 것이다.
----------

mirheekl의 이미지

(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?

--

jos77의 이미지

VS 에서는 char 의 타잎 형변환및 선언이 워낙 모호하니까 안되는 것 같은데
컴파일러에 따라서 char **ar4 를 char [4][] ar4 로 인식해주는 경우가 있을 것 같긴 합니다...
C++ 이었던가 C# 이었던가 저도 저렇게 쓴 기억이 있네요... 물론 좋지 않은 경우라서 나중에 다 [] 로 바꿔줬지만...

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

lovian의 이미지

iostream을 포함시킨거보면,
c++인데요 요 녀석은 타입체크가 엄격하니까 문제가 발생하겠죠.

그리고 비쥬얼 스튜디오는 소스파일 확장자에 따라서 c 또는 c++로 컴파일 하게 되어 있으므로,
c확장자에 stdio.h 등을 이용해 보면 문제가 없을 것 같네요.
-----------------
한글을 사랑합니다.

-----------------
한글을 사랑합니다.

tk3829의 이미지

여전히 오류가 뜨네요. T.T

warning C4047: '초기화 중' : 'char **'의 간접 참조 수준이 'char [4]'과(와) 다릅니다.
error C2078: 이니셜라이저가 너무 많습니다.

jick의 이미지

안되는 게 정상이고 책이 틀린 것 같은데요. 뭐 C 표준에 가끔씩 괴상한 게 섞여있으니까 100% 장담은 못하겠습니다만...

vivisection의 이미지

#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;
}

더블포인터 하면 문자열배열 저장할수 있는데
대입방법이 잘못됬나봅니다

tk3829의 이미지

책이 잘못되었다고 생각했거든요.
더블 포인터라는것 자체가 포인터 변수를 가르키는 것인데
문자열 자체는 상수이고 정적 데이터 영역에 저장되니까
그 정적 데이터 영역을 가르키는 포인터가 있거나
이러한 문자열을 저장할 수 있는 배열이 있어야 성립한다고 생각했는데..

그런 말씀들이 없는거 보니까 제가 번지를 잘못 짚은것 같네요 ㅠㅠ..

mithrandir의 이미지

#include <stdio.h>
 
int main(int argc, char** argv, char** envp)
{
	int arr[] = {1,2,3};
	int *a = {1,2,3};
	int *ptr;
	ptr = arr;
	printf("a=%p\n", a);
	printf("arr=%p\n", arr);
	printf("ptr=%p\n", ptr);
	return 0;
}

결과

a=0x1
arr=0xbfb362e0
ptr=0xbfb362e0

= {...}
는 배열의 initializer이기 때문에 포인터에는 쓸 수 없는 것 같습니다.
이와는 다르게 문자열은 문자배열의 초기화에 사용할 수 있고,
문자포인터의 초기값 혹은 코드 중간에 대입도 가능합니다.

표준에 어찌 나와있는지는 내일 찾아보고 다시 써보겠습니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

ymir의 이미지

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 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.