[질문] C언어/malloc 으로 동적메모리 할당으로 배열만들기

kksir의 이미지

안녕하세요.
malloc를 사용해 메모리를 할당한 후 그것을 배열로 사용하려 합니다.
어떻게 해야 하는지요?

다음과 같은 문장으로 함수에서 포인터를 리턴한 후

p = (int *)malloc(sizeof(i)+*4) // 12byte 할당
return p;

*(p+i) = 1;
과 같은 형식으로 동적으로 할당한 메모리에 접근하려 했는데
gcc 에서 세그먼트 오류가 납니다.

결론적으로 동적으로 할당한 메모리를 int 값을 갖는 배열로 사용하려
면 어떤 방법이 있는지요?
또한 제 접근방식은 왜 안되는지 답변 부탁드립니다.

그럼.

zienie의 이미지

int *i;

i = (int*) malloc(sizeof(int) * 4);


i[0] = 1;
i[1] = 2;
.....

C++ 을 써도 된다면

int *i;

i = new(int[4]);

i[0] = 1;
i[1] = 2;
.....

STL 이 사용 가능하다면....

vector<int>

이렇게 사용이 가능한데요....

좀더 자세한 코드를 올려주시면 좀 더 자세한 답변을 받으실 수 있습니다. ^^

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

소타의 이미지

함수에 *p를 넘기고 그 함수가 malloc 하고 리턴한다면...
**p를 넘기도록 해보세요..

??? 함수( int **p ) {
 *p = (int *)malloc(sizeof(i)+*4); // 12byte 할당
 return p;
}

main() {
 int *p;
 함수( &p );
}

이렇게요..
kksir의 이미지

이제야 인터넷이 됩니다. 아래 소스 올립니다.
==========================================
#include <stdio.h>
#include <stdlib.h>
int *maketapes(int);

int main(void)
{
int i,j;
int ntapes;
int *tape = NULL;

printf("How many tapes? ");
scanf("%d", &ntapes);

tape = maketapes(ntapes);

for(i = 0; i < ntapes; i++)
{
printf("%d th value ? ", i);
scanf("%d", j);
*(tape+i) = j;// wrong why? i dont know.

}
printf("%s", tape);

return 0;
}

int *maketapes(int i)
{
int *p = NULL;
p = (int *)malloc(sizeof(i)*4);
if (p == NULL)
{
puts("Memory allocation failed");
exit(1);
}

return p;
}=======================================

::::::::::: Easy come, Different go.
::::::::: Http://www.geekstep.org

progcom의 이미지

p가 함수 내부에서 선언한 포인터(변수)이므로, 함수 종료시에 사라집니다.

tape가 유효하지 않은 포인터이니 오류가 나겠지요. 위에서 소타님이 말씀하신 방법을 사용하셔야 합니다.

kksir의 이미지

아.. 그렇군요.. 흠 그럼 이중 포인터 말고 다른방법으로 구현 할 수는 없는 것인가요? 보통 이런경우 어떻게 하시는지..

아이디어라도 부탁드리겠습니다.

::::::::::: Easy come, Different go.
::::::::: Http://www.geekstep.org

doldori의 이미지

malloc 사용법에 문제가 있군요. int형 i개를 담을 메모리를 할당할 것을 의도하신
것으로 보입니다.

int* p = (int *)malloc(sizeof(i)*4);

지금은 요행히 *p와 i의 형이 int로 동일하므로 동작은 하겠지만 무조건 4개의
int를 담을 메모리를 할당하는 것이라, p가 double*이거나 i > 4인 경우에는
오동작을 하겠죠. 그리고 캐스팅도 하지 않는 것이 좋습니다. 권장되는 방법은
int* p = malloc(sizeof(*p) * i);

입니다.
그리고 지금은 이중 포인터보다는 리턴으로 처리하는 것이 자연스러워 보입니다.
다른 곳에도 엉뚱한 버그가 있군요.

scanf("%d", &j);

&를 넣어야죠.
그리고 tape가 가리키는 메모리는 문자열이 아닌데 printf("%s", tape)를
하신 것도 의도하신 바는 아닐 거라고 생각합니다.

cdpark의 이미지

p = (int *)malloc(sizeof(i)*4);

부분이 이상하군요.

p = (int *)malloc(sizeof(i)*i);

혹은

p = (int *)malloc(sizeof(int)*i);

가 되어야 할 듯 싶은데요?

progcom의 이미지

아... 착각을 했군요. 잘못된 답변으로 혼동을 드려서 죄송합니다. (__)

dragonkun의 이미지

주제가
"C언어/malloc 으로 동적메모리 할당으로 배열만들기"군요..

예를 들어
int i[4];
와 같은 녀석을 만든다고 하면..

그냥

int *i;
i=(int *)malloc(sizeof(int)*4);

하신 후에..

i[0]=1;
i[1]=2;

같이 쓰시면 됩니다;;

어차피 배열에 사용되는 '[ ]' 기호는..
*(현재의 주소 + sizeof(타입)*n)
에 불과하다고 알고 있습니다;

Emerging the World!

alwaysN00b의 이미지

sizeof(i) * 4

는 4byte를 i개 할당 하실려는지

i type 크기 * 4개를 할당하시려는지 의도는 잘 모르겠으나

sizeof(i)는 항상 동일한 값이 나오므로

main함수의 i loop에서 세그 폴트가 나게됩니다.

그외 scanf와 printf 는 급하게 올리시느라 오타 나신것 같군요. :)

언제나 시작

mithrandir의 이미지

progcom wrote:
p가 함수 내부에서 선언한 포인터(변수)이므로, 함수 종료시에 사라집니다.

tape가 유효하지 않은 포인터이니 오류가 나겠지요. 위에서 소타님이 말씀하신 방법을 사용하셔야 합니다.

p가 내부 변수라도, p가 가리키는 메모리는 유효합니다. malloc 에 의해 동적으로 할당되었으니까요.

그리고 p값에 대해서는,

return p;

를 해서 값을 반환하면 그만입니다. 이부분 자체는 문제가 없지요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

alwaysN00b의 이미지

mithrandir wrote:
progcom wrote:
p가 함수 내부에서 선언한 포인터(변수)이므로, 함수 종료시에 사라집니다.

tape가 유효하지 않은 포인터이니 오류가 나겠지요. 위에서 소타님이 말씀하신 방법을 사용하셔야 합니다.

p가 내부 변수라도, p가 가리키는 메모리는 유효합니다. malloc 에 의해 동적으로 할당되었으니까요.

그리고 p값에 대해서는,

return p;

를 해서 값을 반환하면 그만입니다. 이부분 자체는 문제가 없지요.

컴파일러에 따라 스택을 정리하기도 합니다. 즉 리턴한 주소의 값이 사라지죠

언제나 시작

doldori의 이미지

alwaysN00b wrote:
mithrandir wrote:
progcom wrote:
p가 함수 내부에서 선언한 포인터(변수)이므로, 함수 종료시에 사라집니다.

tape가 유효하지 않은 포인터이니 오류가 나겠지요. 위에서 소타님이 말씀하신 방법을 사용하셔야 합니다.

p가 내부 변수라도, p가 가리키는 메모리는 유효합니다. malloc 에 의해 동적으로 할당되었으니까요.

그리고 p값에 대해서는,

return p;

를 해서 값을 반환하면 그만입니다. 이부분 자체는 문제가 없지요.

컴파일러에 따라 스택을 정리하기도 합니다. 즉 리턴한 주소의 값이 사라지죠


컴파일러 제작자가 스택을 어떻게 정리하건 간에 위의 문장은 유효한 포인터가
반환되는 것을 보장합니다. 사라지는 것은 p이지 p가 가리키는 메모리는 아니지요.
shji의 이미지

cdpark님과 doldori님의 답변이 맞습니다.

malloc에 의해 할당된 메모리는 지역변수 int* p가
소멸되는 것과 관계 없이 유지됩니다.

그리고, malloc(sizeof(i) * i) 혹은 malloc(sizeof(int) * i)
와 같이 할당 갯수가 i가 되도록 해야 하는데
*4로 하신 것이 잘 못 된 부분입니다..

alwaysN00b의 이미지

doldori wrote:
alwaysN00b wrote:
mithrandir wrote:
progcom wrote:
p가 함수 내부에서 선언한 포인터(변수)이므로, 함수 종료시에 사라집니다.

tape가 유효하지 않은 포인터이니 오류가 나겠지요. 위에서 소타님이 말씀하신 방법을 사용하셔야 합니다.

p가 내부 변수라도, p가 가리키는 메모리는 유효합니다. malloc 에 의해 동적으로 할당되었으니까요.

그리고 p값에 대해서는,

return p;

를 해서 값을 반환하면 그만입니다. 이부분 자체는 문제가 없지요.

컴파일러에 따라 스택을 정리하기도 합니다. 즉 리턴한 주소의 값이 사라지죠


컴파일러 제작자가 스택을 어떻게 정리하건 간에 위의 문장은 유효한 포인터가
반환되는 것을 보장합니다. 사라지는 것은 p이지 p가 가리키는 메모리는 아니지요.

앗. 제가 너무 성의없이 답변을 했군요..

malloc 으로 할당했다는걸 깜박하고 버퍼를 스택에 잡았던걸로 착각했습니다. 죄송합니다. :oops:

언제나 시작

익명 사용자의 이미지

ㄹㄹ

댓글 달기

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