[완료]2차원 배열을 동적으로 할당

junk11의 이미지

int ** 혹은 char ** 을
int의 2차원배열, char의 2차원 배열로 쓰고 싶습니다

메모리를 어떤식으로 할당해야 되나요?

int **array;
array = (int **)malloc(sizeof(int *) * 10);
*array = (int *)malloc(sizeof(int) * 10);

이런식으로 하면 될듯해서 해봤는데
데이터를 넣을때 세그먼트폴트가 뜨네요..

그리고 int나 char가 아닌 void 타입일때는 다른가요?

SoulreaveR의 이미지

[code]#include

#define row 10
#define col 10

int main()
{

int **array;
int i,j;

array = (int **)malloc(sizeof(int *) * row);

for(i=0; i *(array+i) = (int *)malloc(sizeof(int) * col);

for(i=0; i for(j=0; j

*(*(array+i)+j) = i+j;

for(i=0; i {
for(j=0; j

{
printf("%d\t", *(*(array+i)+j));
}
printf("\n");
}

return 0;
}[/code]

SoulreaveR의 이미지

아 몰라 아래분이 답해주셔서 지울려고 했는데 흑

klyx의 이미지

예를 들어 int a[10][20]을 동적할당으로 만들고 싶다면

int **a;
a = (int **)malloc(sizof(int *)*10);
for (int i=0; i<10; ++i)
a[i] = (int *)malloc(sizeof(int)*20);

이렇게 하면됩니다.

익명 사용자의 이미지

큰도움이 되었습니다(_ _)

ewqqwe의 이미지

a = (int **)malloc(sizeof(int *)*10);
이부분에 sizeof(int*) 여기서 꼭 *을 써주는 이유가 따로있나요?
사용하지 않아도 실행에 문제가 없는거 같고 아래에서는 사용하지 않는데 붙여주는 이유가 뭔가요?

klyx의 이미지

malloc()의 인자는 할당할 바이트수입니다.
int*를 10개 할당할거니까 int*의 크기(sizeof(int*))의 10배만큼의 바이트수를 인자로 주어야죠.
C/C++을 하면서 가장 주의해야될 것은 '했더니 되니까 문제 없는거다'라고 생각하는 겁니다.
대부분의 경우 그런 것들은 '정의되지 않은 동작'인 경우가 많고, 당장은 되고 내일은 안될수도 있고, 내 컴퓨터에선 백만번 똑같이 잘되도 다른 컴에선 바로 안될수도 있는 겁니다.
참고로 이경우 sizeof(int)로 써도 문제가 없는 예외적인 경우가 있는데 그건 sizeof(int*)와 sizeof(int)가 같은 값인경우로, 대부분의 32비트 컴퓨터에서는 참이지만 64비트컴퓨터에서는 해당되지 않습니다.

ewqqwe의 이미지

말씀하실 때 malloc의 인자는 할당받을 바이트수 라고 하셨는데 그렇게 되면 할당받게되는 배열의 크기가 달리지고 배열의 개수는 똑같게 되지않나요?

klyx의 이미지

malloc은 배열을 할당하지 않습니다. 그냥 몇바이트를 확보하고 그 주소를 반환할 뿐입니다.
반환받은 주소가 가리키는 곳을 배열로 쓸지 뭘로 쓸지는 사용자가 결정하는 겁니다.

HDNua의 이미지

sizeof(int) == sizeof(void *)가 모든 컴퓨터에서 성립하지 않는다는 걸 오늘 처음 알았습니다.
64비트 컴퓨터에서 이것이 성립하지 않는 경우에는 어떤 것이 있는지 여쭤봐도 될까요?

저는 이렇게 생각했습니다.

klyx의 이미지

다양한 플랫폼을 접해보진 못했고, x86_64 기준으로 sizeof(int)는 32bit이지만 모든 포인터는 64bit 부호없는 정수형입니다.
대체로 포인터는 해당 플랫폼의 주소 공간을 나타낼 수 있어야기 때문에 최소한 해당 플랫폼의 비트수 이상을 가지고 보통은 그 최소값인 비트수와 같은 크기를 가집니다.
int의 경우도 플랫폼 의존적으로 16bit->32bit 변화시에 word 크기에 맞춰서 16bit에서 32bit로 확장되었는데, x86_64의 경우에는 x86과의 호환성을 위해서 32bit가 유지된걸로 알고있습니다.

HDNua의 이미지

답변 감사합니다~

저는 이렇게 생각했습니다.

junk11의 이미지

루프로 배열마다 따로 할당을 해줘야 되는군요

-------------------------
내 악마를 영혼에게 팔아넘기다

wsmrdo의 이미지

보통은 포인터 하나 준비하고
배열 X*Y 해서.. 한꺼번에 할당하지요.

설명이 난해하군요.

int *val[10]; <== 이것과 비교하면.
int **array ;

array = val 선언이죠.
*array = val[0]
음 영역을 이차 영역 10개중에 하나만 선언 하셨군요 ^^*

메모리 할당이 부족하겠네요.
[10][10] 배열에서.
[10] <--메모리 확보. 포인터형이죠 포인터를 위한 메모리 확보.
[0][0]~[0][9] 메모리 확보하신 셈이네요. 이부분이 char이나 int나에 따라 달라질듯.

실제 malloc 에서 메모리 할당을 어떻게 하는지는 확인 해봐야 겠고요.

array[0][0] ~ array[0][9]은 어떻든 제대로 동작 하겠네요.
array[1][0] ~ array[9][9]은 확보된 메모리가 없으니 문제가 될겁니다.

포인터 좋아하시는 모양이십니다 ^^
어떻든 위의형식으로. 9개의 공간은 더 쓰셔야 겠습니다.

*array = (int *)malloc(sizeof(int) * 10);
==> array[0] = (int *)malloc(sizeof(int) * 10);
이와 같으니.
array[1] = (int *)malloc(sizeof(int) * 10);
....
array[9] = (int *)malloc(sizeof(int) * 10);

하시던 다른 방법을 취하시던 메모리를 더 확보 하셔야 합니다.

도움이 되시길..

익명 사용자의 이미지

무슨 말씀이신지 잘 이해가 안됩니다 ㅠ_ㅠ

댓글 달기

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