constとfree

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: constとfree

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は諦めます!(笑)
ありがとうございました!

Re: constとfree

#2

by みけCAT » 7年前

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

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

ページトップ