c언어 malloc()을 이용한 배열 생성 관련 질문입니다.

phi의 이미지

c 기초 플러스로 c언어를 공부중입니다.
이 책의 12장에서

double *ptd;
ptd = (double *) malloc(30*sizeof(double));

이렇게 하면 ptd가 double형 값 30개를 가지는 블록을 가리키는 포인터가 아니라,
하나의 double형 값을 가리키는 포인터로 선언 된 것에 주목하라고 되어 있습니다.

이후 설명으로 ptd가 블록의 첫번째 원소를 가리키도록 설정되었고, ptd[0]으로 그 블록의 첫번째 원소에 접근할 수 있다고 합니다.

그런데 맨 처음 ptd를 double형 포인터로 선언하면 그 ptd에는 그 포인터가 가리킬 메모리의 주소가 대입되어야 하는거 아닌가요?

(double)이걸로 변수의 유형을 임시로 변경해서 사용하는 방법은 앞에서 언급한 적이 있어서 어느정도 알고는 있는데,
(double *)이렇게 포인터와 관련해서 사용하는건 처음이라 잘 이해가 안되는 것 같습니다.

어떤 변수가 있을 때 (double *)등과 같이 포인터 형태로 임시로 변경(정확한 이름을 몰라서 이렇게 표현합니다 ㅠㅠ)하면
그 변수가 할당된 메모리의 주소가 나타나는 건가요??
그게 아니라면 포인터로 선언된 ptd에 값을 대입하는 다른 방법이 있는건가요?

phi의 이미지

방금 다시 한번 천천히 읽어보니 malloc()함수의 리턴값이 블록의 첫번째 바이트의 주소값이라고 되어있네요!

그런데 이미 주소값이면 왜 (double)이 아니라 (double *)를 사용하는 건가요?

phi의 이미지

자료형 변환이라고 하네요..
자료형 변환할때 *를 추가하면 주소로 자료형 변환을 한다... 처음 알았습니다..

뭔가 혼자 질문하고 혼자 알아보고, 너무 성급하게 글 쓴거 같긴 하지만, 넘어가주세요..

익명 사용자의 이미지

#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    unsigned int i;
    double (*ptd)[30];
    ptd = (double (*)[30])malloc(30 * sizeof(double));
 
    for(i=0;i<30;i++){
        (*ptd)[i] = i;
    }
    for(i=0;i<30;i++){
        printf("%f\n", (*ptd)[i]);
    }
    return 0;
}

ㅎㅎㅎㅎ
(뚜렷한 이유 없이 이딴 식으로 코딩하면 업계에서 매장당하려나...)

phi의 이미지

이 책에는 배열을 생성하는 세가지 방법중 하나로 이걸 제시하고 있습니다.
그리고 c99이전에는 가변 길이 배열을 형성할 수가 없는데,
이 방법을 이용하면 동적 배열을 형성 할 수 있으며, 가변 길이 배열보다 더 융통성이 하는데..
왜 업계에서는 이 방법을 쓰지 않는게 좋은거가요?

혹시, 이 책이 예전꺼라(5판이라 2005년이네요..) 현재는 더 나은 방법이 있어서 그런건가요?

익명 사용자의 이미지

괜한 오해를 산 모양이네요. 질문자님의 코드를 보고 붙인 커멘트가 아닙니다.
malloc으로 배열을 할당받아 포인터(double *)로 받는 것은 흔한 용례입니다.

제 커멘트는 제가 올려드린 비교적 안 흔한 용례(double (*)[30]로 받는 코드)에 대한 겁니다. 이 쪽도 사용 가능하고 별 문제는 없는데, 좀 더 번거롭고 덜 직관적이죠.

phi의 이미지

답변 감사합니다!
더 공부할께요!

댓글 달기

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