함수에서 외부의 포인터상수를 참조하는 법(숫자 배열의 길이 구하기)

jokerol의 이미지

C언어를 공부하면서 몇일전 부터 생각해 오던 숫자 배열의 길이를 구하는 법은 알았습니다.
배열이름과 배열 요소의 sizeof 연산을 나누어서 숫자 배열의 길이를 구할수 있더군요..
제게 한줄기 광명과도 같은 빛이 내리쬐는 것 같았습니다.

그래서 전 이제 배열을 매개변수로 받는 함수를 작성해서
매개변수로 받은 배열(숫자배열)의 길이를 리턴하는 함수를 만들고 싶었습니다.
매번 sizeof 를 쓰기가 귀찮아서 였죠..

하지만 이런 ! 리턴된 값은 기대하던 값이 아니었죠.
이유는 배열이 매개변수로 전달되면 첫번째 번지값이 포인터로 전달되기 때문이었죠
그래서 제가 만든 함수에서 받은 배열값은 그저 포인터 형이었으므로 예상하던 배열길이가 아닌
포인터 형의 값만 덜렁 나와서 -1 이라던지 1이라는 값이 리턴되고 있었습니다.

그래서 어떻게 하면 메인함수에서 하듯 서브함수에서도 배열의 길이를 sizeof 연산으로 알아낼수
있을까요?

소스:

메인함수에서는 저런 형식으로 숫자 배열의 길이를 구할수 있었습니다.

int data[]={1,2,3};
int data_size=0;

data_size=sizeof(data)/sizeof(data[0]);

그래서 항상 배열 길이를 알기위해 sizeof 연산하기가 귀찮으니 함수를 만들려고 했죠
바로 이 함수

int get_length(int array[]){
int length=(sizeof(array))/(sizeof(array[0]));

return length;
}

하지만 리턴된 값은 기대한 값이 아닙니다.. 매개변수가 배열 전체가 넘어오는게 아니고 맨앞 번지만
포인터로 넘어오니까요

그래서 서브 함수에서 외부의 배열을 통째로 참조할수 없을까요?

Arcyze의 이미지

그냥 sizeof(data)/sizeof(data[0]); 도 꽤 간단해 보이는데 꼭 함수로 하셔야 하나요?

원하시는 방법은 아닐수도 있지만 아래처럼

#include <stdio.h>
 
#define get_length(a) ( sizeof(a) / sizeof(a[0]) )
 
 
int main()
{
	int a[] = {1,2,3,5,6,7,8,10};
	int data_size = 0;
 
 
	data_size = get_length(a);
 
	printf("%d",data_size);
 
}

매크로 함수를 사용하실 수도 있을것 같네요..

jokerol의 이미지

매크로는 그저 치환만 할 뿐이니, 매번 다른 변수에 쓸수는 없을 듯 한데요 ~?
헐 이런 큰 맹점이 !

it takes a day to make you yawn, brother

semmal의 이미지

fread 함수에 자료형과 크기를 받아들이는 인자는 없었을 겁니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

김일영의 이미지

구조체를 하나 만들어서 배열을 그 구조체의 원소로 선언해서 쓰세요.
함수에 넘길때는 그 구조체 자체를 인자로 넘기세요. 그러면 당연히 배열 전체가 넘어가지요.
제가 알기로 C 언어 자체에서 배열을 복사(?)하는 문법은 이것밖에 없는 듯.

jokerol의 이미지

감사 합니다. 매우 복잡해 지는 군요 ~

it takes a day to make you yawn, brother

세이군의 이미지

배열을 복사하는 건 없어도, 배열의 시작주소를 보낼 수는 있습니다.
그러면 배열에 대한 모든 조작이 가능해지지요.

jokerol의 이미지

지웠습니당

it takes a day to make you yawn, brother

jokerol의 이미지

그렇군요 구조체를 이용하는 방법도 있겠고요, 매크로로 함수를 정의해도 되겠군요
아하하.. 저는 그냥 sizeof 계속 써야 하는게 귀찮아서 그랬던 거니 매크로로 정의해서 쓰면 되겠네요 ~

정말 감사 합니다 ~모두들

좋은 하루 되세요

it takes a day to make you yawn, brother

klyx의 이미지

전혀 쌩뚱맞지만... C++을 쓰세요! 각종 컨테이너가 jokerol님을 반겨줄 것입니다. :)

jokerol의 이미지

it takes a day to make you yawn, brother

it takes a day to make you yawn, brother

댓글 달기

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