constとfree

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

constとfree

#1

投稿記事 by makaraito » 7年前

constとmallocとfreeに関してご教授くださいorz

コード:

const char *str;
	str = (char *)malloc(3 * sizeof(char));
	str = "bb";
	printf("%s\n",str); 
	free(str);
警告で
'関数': 異なる 'const' 修飾子です
と表示され、実行すると止まります。ブレークポイントから、停止するのはfreeのとこです。

mallocの時点で怪しいことしてるとは思いますが、
値は変更していないのでfreeできるんじゃないかといろいろ調べてみましたが
結局わからずでした。

よろしければお願いいたしますorz

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

Re: constとfree

#2

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

makaraito さんが書きました:警告で
'関数': 異なる 'const' 修飾子です
と表示され、
freeの引数はconstのついていないvoid*なので、そこにconstがついたポインタを入れてはいけない、ということでしょう。
makaraito さんが書きました:実行すると止まります。ブレークポイントから、停止するのはfreeのとこです。
freeにmallocなどのメモリ管理関数で確保した領域へのポインタではない文字列リテラルへのポインタを渡しているので、未定義動作になります。
makaraito さんが書きました:mallocの時点で怪しいことしてるとは思いますが、
mallocは、C言語では非推奨の戻り値のキャストをしていることと戻り値をチェックしていないこと以外は問題なく、致命的ではないいでしょう。
その次の行でポインタを上書きしているのがメモリリークにも繋がり、いけません。
バッファの中身の文字列をコピーするには、strcpy関数やstrncpy関数(書き込み先バッファのサイズを指定できるので、strcpy関数より安全)を使うといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

makaraito
記事: 4
登録日時: 7年前

Re: constとfree

#3

投稿記事 by makaraito » 7年前

ありがとうございます!
確かにfreeに確保していない領域を渡してました!orz

コード:

	char *str;
	const char * p;
	str = (char *)malloc(2 * sizeof(char));
	str[0] = 'a';
	str[1] = '\0';
	p = str;
	printf("%s\n", p);
	free(p);
ほんとに聞きたかったのはconstとfreeに関してで
みけCAT さんが書きました:freeの引数はconstのついていないvoid*なので、そこにconstがついたポインタを入れてはいけない、ということでしょう。
と考えると
'関数': 異なる 'const' 修飾子です
も理解できそうです!
実際上のコードでも同じエラーが出ましたが動きはするので、このconstは諦めます!(笑)
ありがとうございました!

返信

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