c언어에서...메모리 할당 오류
글쓴이: 익명 사용자 / 작성시간: 금, 2002/05/03 - 5:03오후
메모리 할당에 대한 질문입니다.
디버거로 검사했더니...
다음의 함수에서 오류가 발생되었습니다.
아직 c언어초보라 어디가 잘못 되었는지 감이 안 옵니다.
아시는 분 답변 부탁드립니다.
...............(처음부분 생략)
typedef float **MATRIX;
...............(중간 생략)
MATRIX
init_matrix(int nrows, int ncols)
{
int i;
MATRIX m;
if (nrows <= 0)
return (NULL);
if (ncols <= 0)
return (NULL);
m = (float **) malloc((unsigned) (nrows) * sizeof(float
**));
if (!m)
error_exit("Memory allocation failure. function
init_matrix0()");
for (i = 0; i < nrows; i++)
{
m[i] = (float *) malloc((unsigned) (ncols) * sizeof
(float ));
if (!m[i])
error_exit("Memory allocation failure.
function init_matrix1()");
}
return m;
Forums:
이렇게 고쳐봤습니다.
아마도..에러 않 뜰것 같네요. 에러뜨면 다시 쏘스 함 올려보시죠.
typedef float **MATRIX;
MATRIX
init_matrix(int nrows, int ncols)
{
int i;
MATRIX m;
int error = 0;
if (nrows <= 0)
return (NULL);
if (ncols <= 0)
return (NULL);
m = (float **) malloc( nrows * sizeof(float *));
if (m == NULL)
{
perror("malloc init_matrix1()");
return( NULL);
}
for (i = 0; i < nrows; i++)
{
m[i] = (float *) malloc((ncols) * sizeof(float));
if ( m[i] == NULL )
{
perror("mallloc init_matrix1()");
error = 1;
break;
}
}
if ( error )
{
for ( i = 0 ; i < nrows; i ++ )
{
if ( m[i] == NULL ) break;
else free( m[i] );
}
free( m );
return( NULL );
}
return(m);
}
Re^2: 이렇게 고쳐봤습니다.-[고쳐봤는데 안되네요!]
우선 답변 감사드립니다.
님의 알려주신대로 수정해 보았지만,
오류가 계속 납니다.
소스화일을 여기에 올리려다가...
여러화일로 되어 있는 소스라...좀 무리인 듯해서...
링크되어 있는 님께 메일로 보냈습니다.
다시 한번 수정 부탁드립니다.
그럼...좋은 하루 되세요.
Re: c언어에서...메모리 할당 오류(이렇게....)
test system 384 mem, 1G swap
결과 nrows = 8100, ncols = 10000
시스템에 정의된 만큼은 잡힙니다..
한번 해보세요.....,
MATRIX init_matrix(int nrows, int ncols)
{
unsigned long size;
int i;
MATRIX m;
char *cp;
if (nrows <= 0) return (NULL);
if (ncols <= 0) return (NULL);
size = ncols * nrows * sizeof(float **) * sizeof(float);
if((cp = (char *)malloc(size)) == NULL)
error_exit("Memory allocation failure. function init_matrix0
()");
m = (float **)cp;
for(i = 0, cp+=(nrows*sizeof(float **)); i < nrows; i++, cp +=
(ncols*sizeof(float)))
m[i] = (float *)cp;
return m;
}
Re: c언어에서...메모리 할당 오류
여러번 수행을 했는데 오류가 나오지 않네요.
gcop3 in.001 out.001
gcop3 in.002 out.002
gcop3 in.003 out.003 (x[1] = 1, x[2] = 1)
system kernel linux 2.4.13
cc gcc 2.96
mem 384m, 1G swap
어떻게 하면 오류가 나죠 ?
core가 전혀 발생하지 않네요......
Re^2: c언어에서...메모리 할당 오류[추가질문]
답변 고맙습니다.
이상하네요...제 시스템에서는 오류가 발생하는데...
실행시(gcop3 in.001 out.001),
제가 말씀드렸듯이 오류가 발생안 할 때도 있고, 발생할 때도 있거든요.
디버거로 체크 한번 더 해 주시겠습니까?
솔직히, 디버거도 잘 다루지 못하지만,
디버거로...run gcop3 in.001 out.001로 수행하면,
메모리 할당 부분에서 오류가 생기고...수행이 중단되거든요.
제 시스템 환경은 와우리눅스 7.1에
커널 2.4.2-3, 메모리 1000M, Swap 256M, gcc 2.95
로 되어 있습니다.
그럼, 제 생각에는 이정도 시스템 환경이면, 문제가 없을 것 같은데,
시스템 환경때문에 문제가 발생했을까요?
그럼 다시 한번 답변 부탁드립니다.
Re^3: c언어에서...메모리 할당 오류[추가질문]
오류는 엉둥한 곳에 있군요.
fileio.c에 잘못된 문장이 있습니다.
그리고 그 원인은 gdb를 수행하는데서 발생했습니다.
gdb gcop3
run in.001 out.001
이렇게 수행 해야합니다.
즉 run gcop3 in.001 out.001로 수행 하면
main의 argv에는 1->gcop3, 2->in.001, 3->out.001
이렇게 전달되죠.
근데 왜 에러는 엉둥한 곳에서 나느냐고요.
strip_comments에 잘못된 fclose때문입니다.
if (fp == NULL) {
/* BSG, 열려 있지 않은 file을 close할 수 없음 */
/* fclose(fp); */
error_exit("Input file open failure. function strip_comments()");
}
if (tfile == NULL) {
/* BSG, 열려 있지 않은 file을 close할 수 없음 */
/* fclose(tfile); */
/* fp는 열여 있으니 닫아야 합니다. */
fclose(fp);
error_exit("Temporary file open failure. function strip_comments
()");
}
Re^4: c언어에서...메모리 할당 오류[추가질문]
즉 위에서와 같이 없는 (run gcop3 in.001 out.001)화일을
입력으로 주면 필연적으로 (gcop3는 실행 화일임) core dump가
발생할 수 밖에 없는 상황이 됩니다.
그리고 이때 allocation 할려는 메모리의 크기는 10G가 넘는
값이 들어 오더군요.
즉 화일이 있는 상태면 (gcop3) 너무 많은 메모리를 요구 해서
죽고, 없으면 core dump로 죽고, 그런 식이죠.....
댓글 달기