realloc에 대한 질문입니다.

wkaxld의 이미지

아래 코드는 일예로 간결화 시켜놓은겁니다. 내용은 보시는 바와 같이 간단히 함수 realloc_test가 메모리 블락 두개 a, b를 받은 후 크기를 재 조정한 후 값을 대입 합니다. 물론 realloc_test함수 안에서는 잘 작동합니다만, main함수로 돌아오면 대입된 값들이며, 물론 선두 번지들까지 realloc_test안과는 다르게 나옵니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 5

int realloc_test(int *,int *,int);

int main()
{
  int i;
  int n;
  int *a,*b;

  n=1;
  a=(int *)malloc(sizeof(int)*n);
  b=(int *)malloc(sizeof(int)*n);

  realloc_test(a,b,n);

  for(i=0;i<N;i++){ printf("a[%d]=%d       b[%d]=%d\n",i,a[i],i,b[i]);}

  printf("Freeing memory block\n");
  free(a);
  free(b);
  printf("Complete!!\n");

  return(1);
}

int realloc_test(int *a,int *b,int n)
{
  int i;
  int *new_a,*new_b,*old_a,*old_b;

  new_a=(int *)realloc(a,sizeof(int)*N);
  new_b=(int *)realloc(b,sizeof(int)*N);
  a=new_a; b=new_b;

  for(i=0;i<N;i++){
    a[i]=i+2;      b[i]=i+N+2;
    printf("===In func.: a[%d]=%d       b[%d]=%d\n",i,a[i],i,b[i]);
  }
  printf("\n");

  return(1);
}

위의 예제에서 b를 넘기지 않는경우는 예상대로 작동이 됩니다. 메모리 블락을 하나만 넘기는게 특별한 경우인가요?

cleaneye의 이미지

int realloc_test(int *,int *,int);

이 함수를 int realloc_test(int **, int **, int)로 하셔야 할 듯 합니다.

네 갈길을 가라! 남이야 뭐라든!

wkaxld의 이미지

답변 감사 드립니다.

잠온다~!

alwaysrainy의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 5

int *realloc_test(int *, char , int , int );

int main()
{
  int i, *a, *b;

  a = (int *) malloc(sizeof(int));
  b = (int *) malloc(sizeof(int));

  a = (int *) realloc_test(a, 'a', N, 1);
  b = (int *) realloc_test(b, 'b', N, 5);

  for (i = 0; i < N; i++)
    printf("a[%d] = %d       b[%d] = %d\n",i, a[i], i, b[i]);

  printf("\nFreeing memory block\n");
  free(a);
  free(b);
  printf("Complete!!\n");

  return 1;
}

int *realloc_test(int *p, char ch, int n, int r)
{
  int i;

  p = (int *) realloc(p, sizeof(int) * n);

  for (i = 0; i < n; i++)
  {
    p[i] = i + r + 2;
    printf(" > %c\t %c[%d] = %d\n", ch, ch, i, p[i]);
  }
  printf("\n");

  return p;
}

 > a     a[0] = 3
 > a     a[1] = 4
 > a     a[2] = 5
 > a     a[3] = 6
 > a     a[4] = 7

 > b     b[0] = 7
 > b     b[1] = 8
 > b     b[2] = 9
 > b     b[3] = 10
 > b     b[4] = 11

a[0] = 3       b[0] = 7
a[1] = 4       b[1] = 8
a[2] = 5       b[2] = 9
a[3] = 6       b[3] = 10
a[4] = 7       b[4] = 11

Freeing memory block
Complete!!

이런식의 구성도 가능하죠 ^^

---------------------------------------
세계는 넓고, 할일은 많다.

댓글 달기

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