[C] 선언만 되고 할당되지는 않은 배열의 크기를 구하는 문제

strongspirit의 이미지

안녕하세요.

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

void dum(char *buf);

int main(void)
{
    char a[7];

    int size1=0;
    size1=sizeof(a)/sizeof(a[0]);
    printf("size1   : %d\n", size1);
    
    dum(a);

    return 0;
}

void dum(char *buf)
{
    int size2=0;
    size2=sizeof(buf)/sizeof(buf[0]);
    printf("size2   : %d\n", size2);
}

위에서 보면 size1에서는 크기가 제대로 구해지는걸
볼 수 있는데 dum으로 넘어가면 크기가 안구해지네요.

아무래도 dum으로 넘어갈때 sizeof(buf)하게 되면
pointer의 값을 구하기 때문에 4/1이 되서 그런 결과가
나오지 않나 싶습니다.

그런데 size1에서도 a만으로 sizeof(a)를 했는데요,
char a[1]의 a나 char *a나 같은거 아닌가요?

왜 다르게 나오는지 잘 모르겠습니다.

그리고 dum()에서 인자로 들어온 char *buf의
크기를 구하려면 어떤 방법이 있을까요?

여러가지 해봤는데 쉽지가 않습니다.
초기화가 되지 않아서 '\0' 체크도 어렵구요.

도움 부탁드립니다.

익명 사용자의 이미지

    char a[7];

    int size1=0;
    size1=sizeof(a)/sizeof(a[0]);
    printf("size1   : %d\n", size1); 

여기서는 a 는 char 7개를 담을 수 있는 배열입니다.
따라서 sizeof(a) 를 하면 sizeof(char) * 7 의 값이 나옵니다.

반면에 dum 함수에 a 를 넘길 때 char * 로 넘기므로
dum 함수안에서 sizeof(a) 는 sizeof(char*) 가 됩니다.
(한번 char [7] 이런식으로 크기를 지정한 배열로 넘겨보세요.
될지 안될지는 모르겠습니다.)

dum 함수 내에서 a 가 가리키는 곳 이후에 데이터가 몇개가
있는지 알아낼 방법은 없습니다.
(문자열 처럼 끝에 \0 을 넣는다 는 식의 가정이 있으면 그걸 검사해서
알 수도 있겠지만 그런게 아니라면 불가능합니다.)

마지막으로 char[] 와 char * 는 엄밀히 따지면 서로 다른 것이라고 합니다. 저도 정확히는 잘 모릅니다.........

smoon의 이미지

C언어에서 배열은 몇몇 경우를 제외하고는 포인터로 변환됩니다.

함수의 인자로 배열이 쓰이는 경우가 대표적인 경우라 할 수 있습니다.

함수의 인자로 배열이 전달되는 경우는 포인터로 변환되기 때문에 그 크기를 알 수 없게 됩니다. 함수로 인자를 전달할 때 그 크기도 같이 보내는 것이 일반적인 방법입니다.

댓글 달기

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