[완료] int 형 포인터배열 초기화

이양반의 이미지

안녕하세요. 초보 코더입니다.

상수배열을 초기화 할 일이 있어 포인터 배열 초기화를 시도하는 도중에
초가화가 잘 되지 않아 이렇게 문의 드립니다.

배열에 들어갈 수는
배열1 = { 5, 1, 2, 3, 4, 5 }
배열2 = { 3, 2, 3, 4 }
배열3 = { 4, 3, 4, 5, 6 }
이렇습니다. 이수들은 상수들이라 코딩 과정에서 미리 입력 해 놓을려고 합니다.
그래서 제가 시도한 방법은

int *array[] = {
{ 5, 1, 2, 3, 4, 5 },
{ 3, 2, 3, 4 },
{ 4, 3, 4, 5, 6 }
};
이렇게 했습니다.

의도했던바는 배열 1, 2, 3 의 포인터가 저장되어있는 맴버3개짜리 포인터배열이
만들어지길 기대 했었습니다.

그래서
int *tmp = array[0];
이런식으로 사용 할려고 했었습니다.
분명 제가 실수를 하고 있는것같은데 아직도 제가 어떤 실수를 하고 있는지를 모르겠습니다.

참고로
int *array[] = { 배열1, 배열2, 배열3 };
은 문제가 없습니다.

문제 해결방법은 다양하게 있겠지만 전 위 내용이 외 안되는건지를 확인 하고 싶습니다.

읽어 주셔서 감사합니다.
고마운 답변 부탁 드립니다.

klyx의 이미지

int *array[]는 포인터의 배열이지 배열의 배열이 아닙니다.

int *array[] = {
{ 5, 1, 2, 3, 4, 5 },
{ 3, 2, 3, 4 },
{ 4, 3, 4, 5, 6 }
};
이걸 풀어쓰면

int *a1 = { 5, 1, 2, 3, 4, 5 };
int *a2 = { 3, 2, 3, 4 };
int *a3 = { 4, 3, 4, 5, 6 };
int *array[] = {a1, a2, a3};

입니다. 당연히 안되죠.

이양반의 이미지

int *array[]는 포인터의 배열이지 배열의 배열이 아닙니다.
 
int *array[] = {
{ 5, 1, 2, 3, 4, 5 },
{ 3, 2, 3, 4 },
{ 4, 3, 4, 5, 6 }
};
이걸 풀어쓰면
 
int *a1 = { 5, 1, 2, 3, 4, 5 };
int *a2 = { 3, 2, 3, 4 };
int *a3 = { 4, 3, 4, 5, 6 };
int *array[] = {a1, a2, a3};
 
입니다. 당연히 안되죠.

답변 감사합니다.

네. *array[] 이것을 사용 했을때는 저도 포인터의 배열이 되길 원했습니다.
그래서 정수의 배열도 문자의 배열과 같은 방법으로 연결하려고 했었습니다.

int a1[] = { 5, 1, 2, 3, 4, 5 };
int a2[] = { 3, 2, 3, 4 };
int a3[] = { 4, 3, 4, 5, 6 };
int *array[] = {a1, a2, a3};

위와 같은 코드를 사용 했을때는 제가 원하는 방법대로 수행이 되었습니다.
그래서 먼저 말씀드린 코드를 작성 하게 되었는데 생각과 다르게
문제를 일으켜서 질문을 드리게 되었습니다.
현제 제가 할수 있는 방법을 길이를 모두 같게 하는 방법과
위 예제처럼 a1, a3 . . . an 형식의 사용하지 않은 변수를 할당 하는 방법 입니다.

정말 이 방법 말고는 없는건가요?

좀 다른 말씀을 드려보면
{1,2,3,4}[0] 이건 허용되지 않습니다.
하지만
"1234"[0] 이건 허용 됩니다.
둘이 정수이냐 문자이냐의 차이를 제외하고는 제가 아는 차이첨이 없습니다.
혹 이 둘의 차이를 설명 해 주실수 있으신가요?
(부탁 드리겠습니다 - 염치없이 계속 부탁막 드립니다.)

Gnu is Not Unix

terzeron의 이미지

그냥

#define MAX_COL_SIZE 10
int array[][MAX_COL_SIZE] = {
{ 5, 1, 2, 3, 4, 5 },
{ 3, 2, 3, 4 },
{ 4, 3, 4, 5, 6 }
};

를 사용하시는 게 좋을 것 같습니다.

데이터의 크기가 일정하지 않으면 이중 포인터를 이용하여 동적으로 할당하고 직접 복사해서 넣으시는 방법도 있습니다만, 지금 원하시는 대로 작성하려면 적당한 크기로 배열을 미리 잡아놓고 사용하는 게 좋을 것 같습니다. 다만, 배열의 끝이 어디인지를 알려주는 null data 표시를 해주는 게 좋겠죠.

#define MAX_COL_SIZE 10
#define NULL_DATA -1
int array[][MAX_COL_SIZE] = {
{ 5, 1, 2, 3, 4, 5, NULL_DATA },
{ 3, 2, 3, 4, NULL_DATA },
{ 4, 3, 4, 5, 6, NULL_DATA }
};

value domain에 속하지 않는 값을 NULL_DATA의 값으로 저장해주면 됩니다. 여기서는 예로 -1을 사용하였는데, INT_MAX같은 것을 사용해도 괜찮겠죠.

이양반의 이미지

답변 감사합니다.

말씀 하신 방법으로 해결은 했습니다.
하지만 질문 드린것처럼 할 수 있는 방법이 있을것같기도 하고
질문한 방법에 어떤 문제가 있다면 정확하게 어떤 문제인지를
확인 하고 싶기도 해서 질문을 드렸습니다.

감사합니다.

Gnu is Not Unix

gurumong의 이미지

{1, 2, 3, 4}는 배열, 구조체, 공용체를 선언과 동시에 초기화 할때 사용할수 있는 구문입니다
그 이외에 사용하는것은 특별히 의미있는것이 아니라 그냥 잘못된거예요

int arr1[] = {1, 2, 3, 4}; //초기화가 됨
int arr2[];
arr2 = {1, 2, 3, 4}; //잘못된 구문

또 여기에서...
//array of point to int
//밖같쪽 배열은 초기화 구문에 의해서 초기화가 되지만
//안쪽은 배열이 아니라 포인터임으로 {}로 초기화가 안되요
int *arr3[] = {
{ 5, 1, 2, 3, 4, 5 },
{ 3, 2, 3, 4 },
{ 4, 3, 4, 5, 6 }
};

아는게 많이 없어서 설명이 서툰데 도움이 될지 모르겠네요

이양반의 이미지

결국은 그런 구문을 지원하지 않는거군요.

답변 감사합니다.

Gnu is Not Unix

bushi의 이미지

gcc4 로 시험했습니다.

[bushi@rose net]$ cat ib.c
#include <stdio.h>
int main()
{
	int *a[] = {
		(int[]){1, 2, 3, 4},
		(int[]){5, 6, 7},
		(int[]){8, 8, 10, 11},
	};
 
	int *a0 = 0[a];
	int *a1 = a[1];
	int *a2 = 2[a];
 
	printf("%d\n", a0[2]);
	printf("%d\n", 2[a1]);
	printf("%d\n", a2[2]);
 
	printf("%d %d\n", a2[3], 3[a2]);
	printf("%d %d\n", *(a2+3), *(3+a2));
 
	printf("%d %d\n", a[2][3], 3[a[2]]);
	printf("%d %d\n", *(*(a + 2) + 3), *(3 + *(a + 2)));
	return 0;
}
[bushi@rose net]$ 
[bushi@rose net]$ gcc -o ib ib.c -Wall
[bushi@rose net]$ ./ib
3
7
10
11 11
11 11
11 11
11 11
[bushi@rose net]$

OTL

gurumong의 이미지

(int[]){1, 2, 3, 4}
신기하네요; 이게 가능한줄은 몰랐는데
GCC 확장인가요?

bushi의 이미지

[bushi@rose net]$ gcc -s -o ib ib.c -std=c89 -pedantic -Wall
ib.c: In function ‘main’:
ib.c:5: warning: ISO C90 forbids compound literals
ib.c:5: warning: initializer element is not computable at load time
ib.c:6: warning: ISO C90 forbids compound literals
ib.c:6: warning: initializer element is not computable at load time
ib.c:7: warning: ISO C90 forbids compound literals
ib.c:7: warning: initializer element is not computable at load time
[bushi@rose net]$ 
[bushi@rose net]$ gcc -s -o ib ib.c -std=c99 -pedantic -Wall
[bushi@rose net]$ 

OTL

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.