関数呼び出しのカッコについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
picchi
記事: 3
登録日時: 9年前

関数呼び出しのカッコについて

#1

投稿記事 by picchi » 9年前

はじめまして。関数の呼び出しは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)記載のものです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 関数呼び出しのカッコについて

#2

投稿記事 by みけCAT » 9年前

このコードは12行目で確保された領域の範囲外にアクセスする危険なコードであり、実行してはいけません。

【追記】
「C言語 ポインタ完全制覇」のページのサンプルソースを調べた所、
stackoverflow.cがこのコードに近かったです。本は読んでいないので断定はできませんが、つまりそういうことでしょう。
最後に編集したユーザー みけCAT on 2016年2月27日(土) 23:38 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 関数呼び出しのカッコについて

#3

投稿記事 by みけCAT » 9年前

hello()としない理由は、関数を呼び出さず、その関数へのポインタを使いたいからでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 関数呼び出しのカッコについて

#4

投稿記事 by box » 9年前

picchi さんが書きました:下記プログラムの12行目でhelloと呼び出しされております。
呼び出していません。
関数も、変数と同じようにメモリー空間中のどこかに存在しますから、
アドレスを持っています。
今回のプログラムでは、helloという関数のアドレス(メモリー空間中のどこにあるか、という情報)を
配列に格納しようとしています。

他の回答者さんからの指摘のとおり
picchi さんが書きました:

コード:

	void *buf[10];
	for(i=0 ; i<30 ; i++){
		buf[i] = hello;
	}
}
10個分しか確保していない配列に対し、それを超えた領域に格納しようとしているので、
何か変なことが起きるでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

picchi
記事: 3
登録日時: 9年前

Re: 関数呼び出しのカッコについて

#5

投稿記事 by picchi » 9年前

みけCAT さんが書きました:このコードは12行目で確保された領域の範囲外にアクセスする危険なコードであり、実行してはいけません。

【追記】
「C言語 ポインタ完全制覇」のページのサンプルソースを調べた所、
stackoverflow.cがこのコードに近かったです。本は読んでいないので断定はできませんが、つまりそういうことでしょう。
仰るとおり、参照先はstackoverflow.cです。サンプルソースまで調べていただき深謝します。
詳しい方が見ると、見ただけで危険なコードってのが判るものなんですね。
みけCAT さんが書きました:hello()としない理由は、関数を呼び出さず、その関数へのポインタを使いたいからでしょう。
関数へのポインタを意味するのですね?勉強になりました。
ありがとうございました。

picchi
記事: 3
登録日時: 9年前

Re: 関数呼び出しのカッコについて

#6

投稿記事 by picchi » 9年前

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回表示されたという現象ではなく、なにか変なことが起こっていると、考えるのが妥当ですね。
スッキリ解決です。

閉鎖

“C言語何でも質問掲示板” へ戻る