2차원 배열에 관한 질문입니다.

x2nine의 이미지

안녕하세요!
이번에는 2차원 배열을 함수로 전달하고 값을 설정하는 것에 대한 질문입니다.
1차원은 해당 배열의 첫번째를 주고 함수에서 포인터 값으로 받아서 처리하고 다시 리턴하거나 반환값없이 사용을 하였는데 2차원에서 안됩니다.
제 짧은 생각으로는 안 풀립니다
한수 지도 바랍니다.
감사합니다.

#include <stdio.h>
#include <string.h>

void test(char* line);

int main()
{
	char* line[10][10];
	strcpy(line[1],"ascd");

	test(line);

	printf("%s\n",line[1]);
	printf("line 1 : %s\n",line[1]);
	printf("line 1 : %s\n",line[2]);
	return (0);
}

void test(char* line)
{
	printf("%s\n",line[1]);
	strcpy(line[2],"Line2");
}
wafe의 이미지

char* line[10][10];

은 char 의 2차원 배열이 아닙니다. char의 2차원 배열은
char line[10][10];

이렇게 선언해야 합니다. 그리고 이것을 함수에 전달하려면 전달 받는 함수는
void test(char line[][])

이렇게 되어야 합니다.

Heejoon Lee

bugiii의 이미지

원하시는 것이 10바이트짜리 char 문자열이 10개 있는 2차원 배열 맞나요?

main 함수의 line 배열은 원하시는 char 타입이 요소가 아니라 char* 이 요소입니다. 그러므로 char 형 포인터의 2차원 배열이 되는 것이구요.

그냥 char line[n][m]; 이런 식으로...

p.s. 꼭 글 쓰고 제출하면... 먼저 쓰시는 분이... :)

x2nine의 이미지

답변 감사합니다.
먼저 이 부분은 제가 오타가 났었구요.
아래와 같이 입력되어있었습니다.
char line[10][10];

해서 아래와 같이 수정을 하엿으나
범의를 벗어난다는 오류가 나옵니다.
어찌하면 되나요??

#include <stdio.h>
#include <string.h>

void test(char line[][]);

int main()
{
	char line[10][10];
	strcpy(line[1],"ascd");

	test(line);

	printf("%s\n",line[1]);
	printf("line 1 : %s\n",line[1]);
	return (0);
}

void test(char line[][])
{
	printf("%s\n",line[1]);
	strcpy(line[2],"Line2");
	
}

No pain! No Gain!
It's tricky~

kslee80의 이미지

C++ 이라면 저것이 허용될지 모르겠지만, (아마도 안될 것으로 봅니다.)
아규먼트로 2차원 배열을 넘길 때 '[][]' 로 함수 아규먼트를 정의하는 것은
불가능합니다.

2차원 배열은 프로그램 랭귀지 레벨에서만 2차원이지,
실제로 어셈 코드 이하로 내려가면 무조건 1차원이 됩니다.
(이렇게 불르지는 않지만, 편의상;;)

예로 든 것처럼 [10][10] 짜리 2차원 배열이 있다고 하면,
실제로 메모리는 [100] 인 공간이 잡히고,
[1][0] 번째는 [10], [1][1] 번째는 [11], 등등 해서
이런 식으로 접근하게 됩니다.

그렇기 때문에,
아규먼트로 2차원 배열이 넘어가는 경우에
[][] 중 두번째에 해당하는 값을 모르는 경우에는
배열을 제대로 사용할 수 없으며,
평션 정의시 꼭 두번째에 해당하는 값을 적어줘야 합니다.
'[][10]' 같이 말이죠.

제 기억으로는 '[][]' 로 함수 아규먼트를 정의했을때에는
Syntax 에러 비슷한 에러가 났던거 같네요.

PS) 2차원 배열의 인덱스가 1차원으로 변경되는 공식은
[n][m] 인 배열에서 [x][y] 를 1차원으로 변환하면
(x * m) + y 가 됩니다.

PS2) 애매한 표현을 수정했습니다.

wafe의 이미지

kslee80 wrote:
C++ 이라면 저것이 허용될지 모르겠지만, (아마도 안될 것으로 봅니다.)
아규먼트로 2차원 배열을 넘길 때 [][] 같은 표현은 불가능합니다.

제 기억으로는 [][] 같은 식으로 함수를 정의했을때에는
Syntax 에러 비슷한 에러가 났던거 같네요.

C에서 2차원 배열을 함수 인자로 넘기려면 저런식으로 적어야 합니다. 물론

void test(char line[][10])
{
}

이렇게 두 번째 크기를 결정해주어야 합니다.

Heejoon Lee

댓글 달기

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