[완료]2차원 배열을 동적으로 할당
글쓴이: junk11 / 작성시간: 금, 2008/03/07 - 2:46오후
int ** 혹은 char ** 을
int의 2차원배열, char의 2차원 배열로 쓰고 싶습니다
메모리를 어떤식으로 할당해야 되나요?
int **array;
array = (int **)malloc(sizeof(int *) * 10);
*array = (int *)malloc(sizeof(int) * 10);
이런식으로 하면 될듯해서 해봤는데
데이터를 넣을때 세그먼트폴트가 뜨네요..
그리고 int나 char가 아닌 void 타입일때는 다른가요?
Forums:
부적절한 예시 =3=3=3=3
[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
for(i=0; i
{
for(j=0; j
printf("%d\t", *(*(array+i)+j));
}
printf("\n");
}
return 0;
}[/code]
삭제가 안되네요 ㅠㅠ
아 몰라 아래분이 답해주셔서 지울려고 했는데 흑
예를 들어 int
예를 들어 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);
이렇게 하면됩니다.
정말 감사합니다.
큰도움이 되었습니다(_ _)
a = (int **)malloc(sizof(int *)*10); 질문있습니다
a = (int **)malloc(sizeof(int *)*10);
이부분에 sizeof(int*) 여기서 꼭 *을 써주는 이유가 따로있나요?
사용하지 않아도 실행에 문제가 없는거 같고 아래에서는 사용하지 않는데 붙여주는 이유가 뭔가요?
malloc()의 인자는 할당할
malloc()의 인자는 할당할 바이트수입니다.
int*를 10개 할당할거니까 int*의 크기(sizeof(int*))의 10배만큼의 바이트수를 인자로 주어야죠.
C/C++을 하면서 가장 주의해야될 것은 '했더니 되니까 문제 없는거다'라고 생각하는 겁니다.
대부분의 경우 그런 것들은 '정의되지 않은 동작'인 경우가 많고, 당장은 되고 내일은 안될수도 있고, 내 컴퓨터에선 백만번 똑같이 잘되도 다른 컴에선 바로 안될수도 있는 겁니다.
참고로 이경우 sizeof(int)로 써도 문제가 없는 예외적인 경우가 있는데 그건 sizeof(int*)와 sizeof(int)가 같은 값인경우로, 대부분의 32비트 컴퓨터에서는 참이지만 64비트컴퓨터에서는 해당되지 않습니다.
할당받은 배열의 크기에만 차이가 생기는 건가요?
말씀하실 때 malloc의 인자는 할당받을 바이트수 라고 하셨는데 그렇게 되면 할당받게되는 배열의 크기가 달리지고 배열의 개수는 똑같게 되지않나요?
malloc은 배열을 할당하지 않습니다. 그냥
malloc은 배열을 할당하지 않습니다. 그냥 몇바이트를 확보하고 그 주소를 반환할 뿐입니다.
반환받은 주소가 가리키는 곳을 배열로 쓸지 뭘로 쓸지는 사용자가 결정하는 겁니다.
질문 있습니다.
sizeof(int) == sizeof(void *)가 모든 컴퓨터에서 성립하지 않는다는 걸 오늘 처음 알았습니다.
64비트 컴퓨터에서 이것이 성립하지 않는 경우에는 어떤 것이 있는지 여쭤봐도 될까요?
저는 이렇게 생각했습니다.
다양한 플랫폼을 접해보진 못했고, x86_64
다양한 플랫폼을 접해보진 못했고, x86_64 기준으로 sizeof(int)는 32bit이지만 모든 포인터는 64bit 부호없는 정수형입니다.
대체로 포인터는 해당 플랫폼의 주소 공간을 나타낼 수 있어야기 때문에 최소한 해당 플랫폼의 비트수 이상을 가지고 보통은 그 최소값인 비트수와 같은 크기를 가집니다.
int의 경우도 플랫폼 의존적으로 16bit->32bit 변화시에 word 크기에 맞춰서 16bit에서 32bit로 확장되었는데, x86_64의 경우에는 x86과의 호환성을 위해서 32bit가 유지된걸로 알고있습니다.
답변 감사합니다~
답변 감사합니다~
저는 이렇게 생각했습니다.
답변 감사합니다
루프로 배열마다 따로 할당을 해줘야 되는군요
-------------------------
내 악마를 영혼에게 팔아넘기다
흠 이런 식으로는 사용해 본적이 없군요.
보통은 포인터 하나 준비하고
배열 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);
하시던 다른 방법을 취하시던 메모리를 더 확보 하셔야 합니다.
도움이 되시길..
죄송한데요
무슨 말씀이신지 잘 이해가 안됩니다 ㅠ_ㅠ
댓글 달기