ページ 1 / 1
constとfree
Posted: 2018年1月27日(土) 22:30
by makaraito
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
Re: constとfree
Posted: 2018年1月28日(日) 06:54
by みけCAT
makaraito さんが書きました:警告で
'関数': 異なる 'const' 修飾子です
と表示され、
freeの引数はconstのついていないvoid*なので、そこにconstがついたポインタを入れてはいけない、ということでしょう。
makaraito さんが書きました:実行すると止まります。ブレークポイントから、停止するのはfreeのとこです。
freeにmallocなどのメモリ管理関数で確保した領域へのポインタではない文字列リテラルへのポインタを渡しているので、未定義動作になります。
makaraito さんが書きました:mallocの時点で怪しいことしてるとは思いますが、
mallocは、
C言語では非推奨の戻り値のキャストをしていることと戻り値をチェックしていないこと以外は問題なく、致命的ではないいでしょう。
その次の行でポインタを上書きしているのがメモリリークにも繋がり、いけません。
バッファの中身の文字列をコピーするには、strcpy関数やstrncpy関数(書き込み先バッファのサイズを指定できるので、strcpy関数より安全)を使うといいでしょう。
Re: constとfree
Posted: 2018年1月28日(日) 10:53
by makaraito
ありがとうございます!
確かに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は諦めます!(笑)
ありがとうございました!