C 에서 다음이 가능한 겁니까??

notpig의 이미지

간단한 소스로 보여드리겠습니다.

int a(int *a, char *b){
...
}

main(){

int b=0;

a(&b);
}


이런 코드가 에러 없이 돌아가네요~~~
간만에 C 를 하니~~~신기하네요~~

espereto의 이미지

int a(int *a, char *b);

함수에서 b에 대해 어떠한 읽기/쓰기 작업도 없다면 오류는 나지 않을 것입니다.

읽기작업을 한다고 하더라도, 혹은 쓰기 작업을 한다고 하더라도 오류없이 동작할 가능성도 있습니다. (단, 이것이 정상적인 동작을 의미하는 것은 아닙니다. 오동작을 할 수도 있고 운 좋게도 정상동작을 할 수도 있다는 뜻입니다.)

컴파일러에따라 컴파일 오류가 날 수도 있으나, 그냥 경고에서 끝날 수도 있습니다.

그래도 분명한 건, "잘못된 소스 코드"라는 겁니다.

단지, C언어의 특성과 컴파일러의 특성 때문에 허용될 수도 있는 것이죠.

vacancy의 이미지

파라메터 갯수도 안세준단 말입니까 -_-

notpig의 이미지

오늘 프로그램 작성하다가 이거땜시 한시간 동안 헤멨습니다.ㅋㅋㅋ

솔직히 이건 에러로 처리해야 하는거 아닌가요???

galien의 이미지

어떤 환경에서 어떤 컴파일러를 쓰시나요?

저는 분명히

too few arguments to function `a'

라고 나옵니다.

gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1671)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
notpig의 이미지

좀더 자세히 적겠습니다.

main(){
        int abc=0;
        a(&abc);
 }

int a(int  *a, char *b){
        return 1;
}

두개를 다른 화일에 저장하고 따로 컴파일 해보세요~

gcc test.c test1.c

제 컴파일러는 gcc 이고

notpig@se:~/lejos$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --enable-__cxa_atexit --with-system-zlib --enable-nls --without-included-gettext --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-13)
정태영의 이미지

인자가 하나인 함수 포인터에다가...
두개짜리 함수를 넣어준다거나 거꾸로인 상황을 만들었을땐 모르겠지만...

프로토타입을 선언하고 함수 본체를 정의한 경우라면 gcc에선 컴파일이 안되었던 것 같은데요 ;)

물론 함수포인터에 캐스팅해서 넣었을 경우엔 컴파일도 되고 돌기도 합니다... 결과가 원하는 대로 나올지는 미지수지만요 ;)

c는... arguments 개수 등을 체크하는데 인스트럭션을 낭비하지는 않는 걸로 알고 있습니다 :) .... (컴파일러 레벨에서 말구요..)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

chronon의 이미지

컴파일 되는군요..

그리고 인자 하나 받는 함수에 여러개 인자 넘겨도 되는군요.
자잘한 것 처리해 주고 나면 -Wall 옵션 넣어도 뭐라 안 그러고 넘어가네요.

gcc 버젼은 3.2.2 입니다만..

pynoos의 이미지

가능하지요.
C 이므로 가능합니다.

3.x를 쓰신다면 다음 코드를 컴파일 해보세요.

$ more a.cc
#include <stdio.h>

int func( const char *, const char * )
{
        printf("Hello, world?\n");
        return 0;
}

$ more b.c

int _Z4funcPKcS0_();

int main()
{
        _Z4funcPKcS0_();
        return 0;
}

$ gcc a.cc b.c -o a
$ ./a

확장자가 .cc 이면 c++이고 .c 이면 c 이므로 gcc는 각각에 맞게 컴파일하여 링크하게됩니다.

이분야를 좀더 공부하고 싶으시다면, nm, c++filt, objdump, readelf 등을 연구해보시고
검색 키워드로는 function mangling, decoration 등을 찾아 보시면 됩니다.

notpig의 이미지

pynoos wrote:

이분야를 좀더 공부하고 싶으시다면, nm, c++filt, objdump, readelf 등을 연구해보시고
검색 키워드로는 function mangling, decoration 등을 찾아 보시면 됩니다.

좋은 정보 감사합니다.
C 도 간만에 다시 공부해 봐야겠군요~
galien의 이미지

흥미롭군요......

역시 공부하면 할수록 모르는게 많아 지는 군요.

댓글 달기

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