ページ 1 / 1
関数呼び出しのカッコについて
Posted: 2016年2月27日(土) 23:05
by picchi
はじめまして。関数の呼び出しはfunction()などと、たとえvoidであろうが、関数名の後にカッコをつける必要があると理解しています。
下記プログラムの12行目でhelloと呼び出しされております。
実際にプログラムを動かしてみても、理解できず、ネットで検索しても発見することが出来ませんでした。
hello()としない理由、なぜhelloなのかご教示いただきたいです。
よろしくお願いします。
コード:
#include<stdio.h>
void hello(void){
fprintf(stderr, "hello!\n");
}
void func(void){
void *buf[10];
static int i;
for(i=0 ; i<30 ; i++){
buf[i] = hello;
}
}
int main(){
int buf[1000];
func();
return 0;
}
*当プログラムは「C言語ポインタ完全制覇」(p.100)記載のものです。
Re: 関数呼び出しのカッコについて
Posted: 2016年2月27日(土) 23:31
by みけCAT
このコードは12行目で確保された領域の範囲外にアクセスする危険なコードであり、実行してはいけません。
【追記】
「C言語 ポインタ完全制覇」のページのサンプルソースを調べた所、
stackoverflow.cがこのコードに近かったです。本は読んでいないので断定はできませんが、つまりそういうことでしょう。
Re: 関数呼び出しのカッコについて
Posted: 2016年2月27日(土) 23:31
by みけCAT
hello()としない理由は、関数を呼び出さず、その関数へのポインタを使いたいからでしょう。
Re: 関数呼び出しのカッコについて
Posted: 2016年2月28日(日) 00:40
by box
picchi さんが書きました:下記プログラムの12行目でhelloと呼び出しされております。
呼び出していません。
関数も、変数と同じようにメモリー空間中のどこかに存在しますから、
アドレスを持っています。
今回のプログラムでは、helloという関数のアドレス(メモリー空間中のどこにあるか、という情報)を
配列に格納しようとしています。
他の回答者さんからの指摘のとおり
picchi さんが書きました:
コード:
void *buf[10];
for(i=0 ; i<30 ; i++){
buf[i] = hello;
}
}
10個分しか確保していない配列に対し、それを超えた領域に格納しようとしているので、
何か変なことが起きるでしょう。
Re: 関数呼び出しのカッコについて
Posted: 2016年2月28日(日) 08:08
by picchi
みけCAT さんが書きました:このコードは12行目で確保された領域の範囲外にアクセスする危険なコードであり、実行してはいけません。
【追記】
「C言語 ポインタ完全制覇」のページのサンプルソースを調べた所、
stackoverflow.cがこのコードに近かったです。本は読んでいないので断定はできませんが、つまりそういうことでしょう。
仰るとおり、参照先はstackoverflow.cです。サンプルソースまで調べていただき深謝します。
詳しい方が見ると、見ただけで危険なコードってのが判るものなんですね。
みけCAT さんが書きました:hello()としない理由は、関数を呼び出さず、その関数へのポインタを使いたいからでしょう。
関数へのポインタを意味するのですね?勉強になりました。
ありがとうございました。
Re: 関数呼び出しのカッコについて
Posted: 2016年2月28日(日) 08:17
by picchi
box さんが書きました:
呼び出していません。
関数も、変数と同じようにメモリー空間中のどこかに存在しますから、
アドレスを持っています。
今回のプログラムでは、helloという関数のアドレス(メモリー空間中のどこにあるか、という情報)を
配列に格納しようとしています。
ご回答ありがとうございます。関数のアドレスを示す場合はカッコを付けないということを理解できました。
box さんが書きました:
他の回答者さんからの指摘のとおり
picchi さんが書きました:
コード:
void *buf[10];
for(i=0 ; i<30 ; i++){
buf[i] = hello;
}
}
10個分しか確保していない配列に対し、それを超えた領域に格納しようとしているので、
何か変なことが起きるでしょう。
for文の中の意味まで解説いただき、ありがとうございました。
ちなみに私の環境(gcc ver4.9.3)では、19回「hello!」と表示されました。
19回表示されたという現象ではなく、なにか変なことが起こっていると、考えるのが妥当ですね。
スッキリ解決です。