malloc()함수의 이상한 메모리 할당... ...
행렬의 곱을 계산하여 출력하는 프로그램입니다.
이상한 점은 행렬의 크기를 프롬프트상에서 입력받아 메모리를 할당하게 되어 있는데 0 0 0으로 크기를 입력하였을때 *result[z], *a[x], *b[d]의 선언 순서에 따라 result[z]에 메모리 할당이 되었다 안 되었다 합니다. 왜 이렇죠????
0 0 0 으로 입력하면 원래 메모리 할당 자체가 안되어야 하는거 아닌가요???
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mulTarr(int **res, int **a, int **b, int m, int p, int n);
int main(){
int z,x,d;
printf("input :");
scanf("%d %d %d",&z,&x,&d);
int *result[z]; ---1
int *a[x]; ---2
int *b[d]; ---3
1 2 3 번 순으로 선언 하면 행렬 a를 출력하고 세그면트 에러
3 2 1 번 순은로 선언 하면 값은 정확히지 않지만 메모리가 모두 할당되어
행렬 a b result 모두 출력
2 1 3 번 순으로 선언 하면 result[2]에 메모리 할당이 실패했다는 메시지 출력 후 --- > 행렬 a b 를 출력하고 세그먼트 에러
도저히 이해 할수가 없는 메모리 할당 결과입니다.!!!!
int i, j;
int q=0;
while (q<3){
<-----원래 3대신 z이여야 하지만 임으로 3의값을 둠
result[q]=(int *) malloc(sizeof(int)*2);
if(result[q] == NULL) {
printf("Memory Allocation failed 0 %d ", q);
}
q++;
}
q=0;
while (q<3){
a[q]=(int *) malloc(sizeof(int)*2);
if(a[q] == NULL) {
printf("Memory Allocation failed 1 %d", q);
}
q++;
}
q=0;
while (q<2){
b[q]=(int *) malloc(sizeof(int)*2);
if(b[q] == NULL) {
printf("Memory Allocation failed 2 %d", q);
}
q++;
}
srand((unsigned int) time(NULL));
for (i=0;i<3;i++) {
for(j=0;j<2;j++) {
a[i][j]=(int) (rand() % 10);
printf("%d ",a[i][j]);
}
printf("\n");
// --------------------------------------------세그멘테이션 오류//
}
//printf("\n");
//
for(i=0;i<2;i++){
for(j=0;j<2;j++){
b[i][j]=(int) (rand() % 10);
printf("%d ",b[i][j]);
}
printf("\n");
// printf("error");
}
mulTarr(result, a, b, 3, 2, 2);
q=0;
while (q<3){
free(result[q]);
q++;
}
q=0;
while (q<3){
free(a[q]);
q++;
}
q=0;
while (q<2){
free(b[q]);
q++;
}
return 0;
}
void mulTarr(int **res, int **a, int **b, int m, int p, int n){
int i, j, c, r, k;
int sum;
for (c=0;c<m;c++){
for (r=0;r<n;r++){
sum=0;
for(k=0;k<p;k++){
sum+=a
..
코드를 올리실때는 [ code ] [ /code ] ([] 사이의 빈공간은 없애세요) 를 이용하시면 다른 분들이 보시기에 깔끔하게 보입니다.
이렇게 올리시면 좀처럼 답변이 안올라올 것 같습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
"원래 3대신 z이여야 하지만 임으로 3의값을 둠"은 무슨 뜻인가요?
"원래 3대신 z이여야 하지만 임으로 3의값을 둠"은 무슨 뜻인가요?
0 0 0을 입력했다는 건 z x d 값이 0이라는 건가요?
죄송합니다. 처음 글을 올리다 보니 코드가 너무 길어졌습니다. :D
죄송합니다. 처음 글을 올리다 보니 코드가 너무 길어졌습니다. :D
0 0 0 이란 뜻은 z x d 의 값이 0이란 뜻입니다. 그리고 메모리 할당할때 임으로 3을 잡았단 뜻은 그 값이 0 만 아니면 메모리 할당이 된다는 뜻입니다.
원래 코든 q < z 이지만 z 대신에 0 이외의 값 1 또는 2를 적어 주어도 메모리가 할당 됩니다.
[code:1] int z,x,d; printf&
위와 같은 선언이 되던가요? 정확히 알지는 못하겠습니다만..
2차원 배열의 동적 메모리 할당이라면 다음과 같이 쓰는 것으로 알고 있습니다.
[quote="lazarus"][code:1] int z,x,d
저도 C++를 잘모르지만 int *val[3]; 이되므로
int포인터배열이 됩니다.
그중 첫번째에 sizeof(int)*2 이므로 val[0]에는 int공간이 2개죠
int *val[0]; 이라는 선언이 유효한건지 잘 모르겠군요.
잘모르지만 정의되지않은 행동 같습니다만.. 고수분들 답변 부탁드립니다.
언제나 시작
[quote="lazarus"][code:1] int *result
그러나 C99 에서는 합법이며, 일부 컴파일러에서는 확장기능으로서 지원하기도 합니다. (참고: info gcc 'C extensions' 'Variable Length')
[quote="alwaysN00b"]int *val[0]; 이라는 선언이
C++98 에서라면 유효하지 않습니다. 표준 (8.3.4.1) 에 이르길,
어쨌건 표준과는 별도로, GCC 에서는 확장 기능으로서 길이가 0 인 배열을 허용합니다. (참고: info gcc 'C extensions' 'Zero Length')
질문의 의도에서 답변이 좀 벗아난듯 싶습니다.
질문의 의도에서 답변이 좀 벗어난듯 싶습니다.
질문은 배열의 크기가 0인 배열을 선언했을 경우 result, a, b
이 3개의 배열의 선언 순서에 따라 왜 메모리 할당되기도 하고 또 할당오류가 나기도 하고 하는가 입니다. 선언순서와 메모리 할당과 무슨 연관이 있는 건가요???
:roll:
Re: 질문의 의도에서 답변이 좀 벗아난듯 싶습니다.
C99 에서가 아닌 한 VLA 자체가 이미 불법이며, 설령 C99 라 가정하더라도 크기 0 인 배열을 선언한 것이 또한 불법입니다.
그리고, 불법의 결과는 뭐가 됐든 정상입니다.
우선 지적받은 구문부터 합법적인 구문으로 바꿔쓰시기 바랍니다. z 가 들어갈 곳에 3 을 대용한 것도 비상식적인 땜빵이며 에러의 직접적인 원인입니다. 역시 수정하시기 바랍니다.
댓글 달기