C언어 이차원배열 동적할당에 관해서 질문있습니다.

shockwave7의 이미지

안녕하세요

C언어에서 이차원 배열을 동적할당으로 생성 하였습니다.

값을 초기화 할때 생성후에 함수 인자로 넘겨서 함수에서 값을 초기화 시키고

다시 메인에서 출력시키면 프로그램이 죽어 버립니다. APPCRASH 이벤트가 생기면서 프로그램 닫기가 뜨네요...

메인에서 초기화 시킨뒤에 출력시키면 제대로 출력되구요...

함수에서 초기화 시키고 출력문까지 넣어서 출력시키면 또 되네요...

혹시 포인터를 잘못 넘긴건가 싶어서 동적할당 말고 정적할당으로 생성시켜서 해보면 또 되네요...

어떻게 해결해야 할까요? 제가 모르고 있는 뭔가가 있는것 같습니다 ㅠㅠ

생각을 해봐도 해결방법이 잘 떠오르지 않네요 고수님들의 도움을 부탁드립니다 ㅠㅠ

소스는 아래와 같습니다.

#include <stdio.h>
#include <stdlib.h>
 
#define MAXSIZE 5
 
void InputValue(int (*_arr)[MAXSIZE], int _arrHeight, int _arrWidth)
{
	int arrHeight = _arrHeight;
	int arrWidth = _arrWidth;
	int i,j;
 
	// 값 입력
	for(i=0;i<arrHeight;i++)
	{
		for(j=0;j<arrWidth;j++) 
		{
			_arr[i][j] = 1;
		}
 
	}
 
}
 
int main(void)
{	
	int arrHeight, arrWidth, i,j;
	int **arr;
 
	arrHeight = MAXSIZE;
	arrWidth = MAXSIZE;
 
 
	// 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE)
	arr = (int**)malloc(sizeof(int)*arrHeight);
	for(i=0;i<arrHeight;i++)
	{
		arr[i] = (int*)malloc(sizeof(int)*arrWidth);
	}
 
	InputValue(arr, arrHeight, arrWidth); // 배열에 값을 입력
 
 
 
	// 값 출력
	for(i=0;i<arrHeight;i++)
	{
		for(j=0;j<arrWidth;j++) 
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
 
 
	for(i=0;i<arrHeight;i++)
	{
		free(arr[i]);
	}
	free(arr);
 
	return 0;
}

디버깅 해서 한 라인씩 돌려보면 메인에서 출력할때부터 문제가 발생합니다.

snowall의 이미지

아래의 입력형식을 참고해서 코드 구문으로 감싸 주세요. 소스가 제대로 안떠요..-_-

피할 수 있을때 즐겨라! http://melotopia.net/b

shockwave7의 이미지

앗... 깜빡하고 그냥 올려버렸네요 ㅠㅠ

수정했습니다!

kgcrom의 이미지

// 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE)
arr = (int**)malloc(sizeof(int)*arrHeight);

이부분을

// 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE)
arr = (int**)malloc(sizeof(int*)*arrHeight);

로 변경해서 해보세요~

혹시 운영체제가 64bit이세요?

흘러가고있는 지금 이 시간에 충실하자.

shockwave7의 이미지

바꿔도 똑같네요 ㅠㅠ 윈도우7 64비트 입니다 ㅠ

parkon의 이미지

저도 극강 초보이긴 합니다만
혹시

위의 kgcrom님께서 말씀하신것과 함께

void InputValue(int (*_arr)[MAXSIZE], int _arrHeight, int _arrWidth)
이 구문을

void InputValue(int **_arr, int _arrHeight, int _arrWidth)
이렇게 바꾸면 되지 않을까요 ?

익명 사용자의 이미지

리눅스에서는 (*_arr)[MAXSIZE] 이부분 자체가 에러가 뜨는데..허허.

익명 사용자의 이미지

arr = (int**)malloc(sizeof(int)*arrHeight);

arr = (int**)malloc(sizeof(int*)*arrHeight);
가 아닐까 조심스럽게 생각해봅니다.

alwaysN00b의 이미지


저도 2차원 포인터를 처음 구현할때 같은 고민을 했었는데, 윗분들이 답을 다 해주셨네요.
첫번째 height 할당때는 int* 의 크기를 할당해야 합니다.

그리고, 디버깅 하시면서 증가하는 주소값을 확인해보면 명확하게 이해하실수 있을겁니다.

참고로, 포인터에 관한 설명입니다.

http://unixwiz.net/techtips/reading-cdecl.html

언제나 시작

댓글 달기

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