c言語のダブルポインタ(char **)の引数渡しで困っています。
ワーニングが取れず、無視して実行するとセグメンテーション違反
となります。
ワーニングを取る方法をご存じないでしょうか?
もしくは言語仕様、gcc仕様が要因でしょうか?
バージョンはgcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)です。
001 void func(char **p1)
002 {
003 static char *s="AAA";
004 **p1 = s;
005 }
006 int main(void)
007 {
008 char *q1;
009 func(&q1);
010 return(0);
011 }
$ cc -Wall -o pp pp.c
pp.c: In function ‘func’:
pp.c:5: 警告: assignment makes integer from pointer without a cast
実行すると004行目で 'セグメンテーション違反です (core dumped)'となります。
004行目を *p1 = s; にするとワーニング無しとなり、
問題無くcall側のq1に先頭アドレスがセットされますが、
何か納得がいきません。
ちなみに、最初のcore吐きプログラムのアセンブルリストは
以下のようになります。
(*)位置で変なコードとなっていまが、ワーニングが出て
いるので当然なのかもしれません。
(gdb) disass
Dump of assembler code for function func:
0x08048354 <func+0>: push %ebp
0x08048355 <func+1>: mov %esp,%ebp
0x08048357 <func+3>: mov 0x8(%ebp),%eax
0x0804835a <func+6>: mov (%eax),%edx
0x0804835c <func+8>: mov 0x8049560,%eax
*0x08048361 <func+13>: mov %al,(%edx)
0x08048363 <func+15>: pop %ebp
0x08048364 <func+16>: ret
End of assembler dump.
そして 004行目を *p1 = s;にした場合が以下となります。
想定通りのコードですが、何故なのかわかりません。
Dump of assembler code for function func:
0x08048354 <func+0>: push %ebp
0x08048355 <func+1>: mov %esp,%ebp
0x08048357 <func+3>: mov 0x8049560,%edx
0x0804835d <func+9>: mov 0x8(%ebp),%eax
0x08048360 <func+12>: mov %edx,(%eax)
0x08048362 <func+14>: pop %ebp
0x08048363 <func+15>: ret
End of assembler dump.
No.2ベストアンサー
- 回答日時:
**p1 はchar型でsはポインタ型なのだから当然では?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- 工学 Pythonの3次元描画に関する質問です 3 2022/12/07 20:07
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Ruby 教えてください 2 2023/01/04 17:50
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- UNIX・Linux gawk 3 2022/08/18 14:07
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C++17で、unsigned char * 配列...
-
苦しんでCを読んでchar型は文字...
-
fstream型オブジェクトを関数の...
-
ポインタ演算がうまくできません
-
char形配列の整数を抜き出したい
-
入力された文字列の中の数字を...
-
C言語の文字リテラル中の16進文...
-
CStringからchar*への型変換に...
-
strtok関数の使い方 その2
-
文字の代入とコピーについて
-
c++のstd::stringについて
-
DWORDとcharの変換
-
ASCIIコードへの変換方法
-
ポインタを使って回文かどうか...
-
動的メモリの初期化方法について。
-
char型について【初心者です】
-
置換について
-
C言語のchar型配列を計算させる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報