c언어에서...메모리 할당 오류

익명 사용자의 이미지

메모리 할당에 대한 질문입니다.

디버거로 검사했더니...

다음의 함수에서 오류가 발생되었습니다.
아직 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;

익명 사용자의 이미지

아마도..에러 않 뜰것 같네요. 에러뜨면 다시 쏘스 함 올려보시죠.

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);
}

익명 사용자의 이미지

우선 답변 감사드립니다.

님의 알려주신대로 수정해 보았지만,
오류가 계속 납니다.

소스화일을 여기에 올리려다가...
여러화일로 되어 있는 소스라...좀 무리인 듯해서...
링크되어 있는 님께 메일로 보냈습니다.

다시 한번 수정 부탁드립니다.

그럼...좋은 하루 되세요.

익명 사용자의 이미지

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;
}

익명 사용자의 이미지

여러번 수행을 했는데 오류가 나오지 않네요.

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가 전혀 발생하지 않네요......

익명 사용자의 이미지

답변 고맙습니다.

이상하네요...제 시스템에서는 오류가 발생하는데...

실행시(gcop3 in.001 out.001),

제가 말씀드렸듯이 오류가 발생안 할 때도 있고, 발생할 때도 있거든요.

디버거로 체크 한번 더 해 주시겠습니까?

솔직히, 디버거도 잘 다루지 못하지만,

디버거로...run gcop3 in.001 out.001로 수행하면,

메모리 할당 부분에서 오류가 생기고...수행이 중단되거든요.

제 시스템 환경은 와우리눅스 7.1에
커널 2.4.2-3, 메모리 1000M, Swap 256M, gcc 2.95
로 되어 있습니다.

그럼, 제 생각에는 이정도 시스템 환경이면, 문제가 없을 것 같은데,
시스템 환경때문에 문제가 발생했을까요?

그럼 다시 한번 답변 부탁드립니다.

익명 사용자의 이미지


오류는 엉둥한 곳에 있군요.
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
()");
}

익명 사용자의 이미지

즉 위에서와 같이 없는 (run gcop3 in.001 out.001)화일을
입력으로 주면 필연적으로 (gcop3는 실행 화일임) core dump가
발생할 수 밖에 없는 상황이 됩니다.
그리고 이때 allocation 할려는 메모리의 크기는 10G가 넘는
값이 들어 오더군요.

즉 화일이 있는 상태면 (gcop3) 너무 많은 메모리를 요구 해서
죽고, 없으면 core dump로 죽고, 그런 식이죠.....

댓글 달기

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