スタティックライブラリでのウォーニング。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大工

スタティックライブラリでのウォーニング。

#1

投稿記事 by 大工 » 18年前

最近ライブラリの作成を勉強している大工です。

スタティックライブラリについての質問です。

コンパイルした結果が・・・

$ gcc -c func2.c
func2.c: In function `msg':
func2.c:5: warning: function returns address of local variable

です。ソースコードは以下です。
#include <stdio.h>

char *msg(){
	char m[/url] = "This is a test.\n";
	return m;
}
このワーニングの解説を宜しくお願いします。

Hermit

Re:スタティックライブラリでのワーニング。

#2

投稿記事 by Hermit » 18年前

Excite翻訳で翻訳すると、
"機能は局所変数のアドレスを返します。"
となりました。
msg() 中で確保された領域のアドレスですので、
msg を抜けた時点で、その領域は開放され、
他で再利用される可能性大ですので、使わない方が懸命です。

大工

Re:スタティックライブラリでのワーニング。

#3

投稿記事 by 大工 » 18年前

#include <stdio.h>

int  mul(int a){
	return a * a;
}
上記のソースでコンパイルした場合質問にあるようなワーニングは出なかったんですが違いは何なんですか?
アドレスを返しているという点なんでしょうか??

大工

Re:スタティックライブラリでのワーニング。

#4

投稿記事 by 大工 » 18年前

このコメントは削除して下さい。

返信ミスです

GPGA

Re:スタティックライブラリでのワーニング。

#5

投稿記事 by GPGA » 18年前

>では下記のソースでコンパイルした場合質問にあるようなワーニングは出なかったんですが違いは何なんですか?
>アドレスを返しているという点なんでしょうか??
はい、その通りです。

box

Re:スタティックライブラリでのワーニング。

#6

投稿記事 by box » 18年前

> アドレスを返しているという点なんでしょうか??

どうしても配列mのアドレスを返したい場合は、
staticを付けて定義してください。

大工

Re:スタティックライブラリでのワーニング。

#7

投稿記事 by 大工 » 18年前

あぁ~なるほど!!
開放されるんですね・・・・・

ありがとうございます

static ですか・・・今思えばそうですよね・・^^;

大工

Re:スタティックライブラリでのワーニング。

#8

投稿記事 by 大工 » 18年前

すみません・・・

実際コンパイルしてみたらまたワーニングが・・・・
#include <stdio.h>

char * _msg(){
	static char _m[/url] = "This is an apple.";
	return _m;
}
#include <stdio.h>

char * msg(){
	static char m[/url] = "This is a test.\n";
	return m;
}
#include <stdio.h>

int main (void){

	char *p, *q;

	p = msg();
	q = _msg();

	printf("p: %sq: %s\n", p, q);

	return 0;
}
上から func1.c func2.c compe.c です。

cygwinでコンパイルしてみたところ
$ gcc compe.c text.lib -o file
compe.c: In function `main':
compe.c:7: warning: assignment makes pointer from integer without a cast
compe.c:8: warning: assignment makes pointer from integer without a cast
と表示されてしまいました。

func1.c func2.c compe.c を1つにまとめたtest.c をコンパイルするとワーニングもでず成功しました。

原因を教えて下さい。

大工

Re:スタティックライブラリでのワーニング。

#9

投稿記事 by 大工 » 18年前

extern char * _msg();
extern char * msg();

とプロトタイプ宣言をcompe.cにすればコンパイルできました。

別の場所で聞いてみてこの方法を教えてくれたんですが、『なぜ』という部分は教えて頂けませんでした。


どうしてプロトタイプ宣言が必要なんでしょうか?

box

Re:スタティックライブラリでのワーニング。

#10

投稿記事 by box » 18年前

> compe.c:7: warning: assignment makes pointer from integer without a cast
> compe.c:8: warning: assignment makes pointer from integer without a cast

compe.cにmsg()と_msg()のプロトタイプ宣言がない場合、
コンパイラはmsg()と_msg()の戻り値をint型とみなします。

msg()の戻り値をpに、_msg()の戻り値をqにそれぞれ代入する際、
int型をchar *型に代入しようとすることになります。
そこで、コンパイラは「左右両辺の型が異なる代入を行なおうとしていますが、
大丈夫ですか?」という意味の警告を出します。

大工

Re:スタティックライブラリでのワーニング。

#11

投稿記事 by 大工 » 18年前

戻り値がint型ですか・・・・

まったく知りませんでした・・・

ありがとうございました。

閉鎖

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