malloc()함수의 이상한 메모리 할당... ...

kldpcadk의 이미지

행렬의 곱을 계산하여 출력하는 프로그램입니다.

이상한 점은 행렬의 크기를 프롬프트상에서 입력받아 메모리를 할당하게 되어 있는데 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

[k]*b[k][r];
 
			}
 
			res[c][r]=sum;
 
		}
 
	}
 
 
	for (i=0;i&lt;3;i++) {
		for(j=0;j&lt;2;j++){
			printf("  %d  ", res[i][j]);
		}
		printf("\n");
	}
	printf("\n");
 
 
 
 
}
chadr의 이미지

코드를 올리실때는 [ code ] [ /code ] ([] 사이의 빈공간은 없애세요) 를 이용하시면 다른 분들이 보시기에 깔끔하게 보입니다.

이렇게 올리시면 좀처럼 답변이 안올라올 것 같습니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

cdpark의 이미지

"원래 3대신 z이여야 하지만 임으로 3의값을 둠"은 무슨 뜻인가요?

0 0 0을 입력했다는 건 z x d 값이 0이라는 건가요?

kldpcadk의 이미지

죄송합니다. 처음 글을 올리다 보니 코드가 너무 길어졌습니다. :D

0 0 0 이란 뜻은 z x d 의 값이 0이란 뜻입니다. 그리고 메모리 할당할때 임으로 3을 잡았단 뜻은 그 값이 0 만 아니면 메모리 할당이 된다는 뜻입니다.

원래 코든 q < z 이지만 z 대신에 0 이외의 값 1 또는 2를 적어 주어도 메모리가 할당 됩니다.

lazarus의 이미지

    int z,x,d; 

    printf("input :"); 
    scanf("%d %d %d",&z,&x,&d); 

    int *result[z];
    int *a[x];
    int *b[d];

위와 같은 선언이 되던가요? 정확히 알지는 못하겠습니다만..
2차원 배열의 동적 메모리 할당이라면 다음과 같이 쓰는 것으로 알고 있습니다.

int main()
{
    int size, i;
    int **ary;

    scanf("%d", &size);

    ary = (int **) malloc ( sizeof(int *) * size );
    for(i = 0 ; i < size ; i++)
        ary[i] = (int *) malloc( sizeof(int) * 2 );

    .....

    for(i = 0 ; i < size ; i++)
        free(ary[i]);
    free(ary);

    exit(0);
}
alwaysN00b의 이미지

lazarus wrote:
    int z,x,d; 

    printf("input :"); 
    scanf("%d %d %d",&z,&x,&d); 

    int *result[z];
    int *a[x];
    int *b[d];

위와 같은 선언이 되던가요? 정확히 알지는 못하겠습니다만..
2차원 배열의 동적 메모리 할당이라면 다음과 같이 쓰는 것으로 알고 있습니다.

int main()
{
    int size, i;
    int **ary;

    scanf("%d", &size);

    ary = (int **) malloc ( sizeof(int *) * size );
    for(i = 0 ; i < size ; i++)
        ary[i] = (int *) malloc( sizeof(int) * 2 );

    .....

    for(i = 0 ; i < size ; i++)
        free(ary[i]);
    free(ary);

    exit(0);
}

저도 C++를 잘모르지만 int *val[3]; 이되므로
int포인터배열이 됩니다.
그중 첫번째에 sizeof(int)*2 이므로 val[0]에는 int공간이 2개죠

int *val[0]; 이라는 선언이 유효한건지 잘 모르겠군요.
잘모르지만 정의되지않은 행동 같습니다만.. 고수분들 답변 부탁드립니다.

언제나 시작

singlet의 이미지

lazarus wrote:
    int *result[z];
    int *a[x];
    int *b[d];
위와 같은 선언이 되던가요? 정확히 알지는 못하겠습니다만..
Pre-ANSI C, C90, C++98 에서는 불법입니다. [] 안에 들어가는 값은 컴파일 시점에서 결정되는 상수여야 합니다.

그러나 C99 에서는 합법이며, 일부 컴파일러에서는 확장기능으로서 지원하기도 합니다. (참고: info gcc 'C extensions' 'Variable Length')

singlet의 이미지

alwaysN00b wrote:
int *val[0]; 이라는 선언이 유효한건지 잘 모르겠군요.
잘모르지만 정의되지않은 행동 같습니다만.. 고수분들 답변 부탁드립니다.

C++98 에서라면 유효하지 않습니다. 표준 (8.3.4.1) 에 이르길,
Quote:
In a declaration T D where D has the form

D1 [constant-expression_opt]

(중략) If the constant-expression (5.19) is present, it shall be an integer constant and its value shall be greater than zero.


어쨌건 표준과는 별도로, GCC 에서는 확장 기능으로서 길이가 0 인 배열을 허용합니다. (참고: info gcc 'C extensions' 'Zero Length')
kldpcadk의 이미지

질문의 의도에서 답변이 좀 벗어난듯 싶습니다.

질문은 배열의 크기가 0인 배열을 선언했을 경우 result, a, b

이 3개의 배열의 선언 순서에 따라 왜 메모리 할당되기도 하고 또 할당오류가 나기도 하고 하는가 입니다. 선언순서와 메모리 할당과 무슨 연관이 있는 건가요???
:roll:

singlet의 이미지

kldpcadk wrote:
질문은 배열의 크기가 0인 배열을 선언했을 경우 result, a, b 이 3개의 배열의 선언 순서에 따라 왜 메모리 할당되기도 하고 또 할당오류가 나기도 하고 하는가 입니다.

C99 에서가 아닌 한 VLA 자체가 이미 불법이며, 설령 C99 라 가정하더라도 크기 0 인 배열을 선언한 것이 또한 불법입니다.

그리고, 불법의 결과는 뭐가 됐든 정상입니다.

우선 지적받은 구문부터 합법적인 구문으로 바꿔쓰시기 바랍니다. z 가 들어갈 곳에 3 을 대용한 것도 비상식적인 땜빵이며 에러의 직접적인 원인입니다. 역시 수정하시기 바랍니다.

댓글 달기

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