ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

関数の引数の値を書き換えたいです。
DGBのx/iコマンドでアッセンブラをみて
レジスタに格納された引数の値を書き換えようと考えています。
このコマンドで書き換えたい関数の$ebpを見て書き換える予定です。
引数を書き換えたい関数の戻り値が構造体であるかないかで、$ebpからのアドレスの位置が変更されてしまいます。
他に格納されている関数の引数のアドレスが1つに固定できる方法はないでしょうか?
できないとしたら、条件で関数の戻り値が構造体かどうかの判断はどこでつければよいでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

呼び出された関数の中でsetコマンドを使って変更することが出来るはずですが、そういうことではないのでしょうか?

    • good
    • 0

構造体へのポインタを返すように関数を書換える... かなぁ?

この回答への補足

具体的には、どのようにすればよいか教えていただけますか?

補足日時:2005/04/13 23:53
    • good
    • 0
この回答へのお礼

考え方が一つ増えました。
ありがとうございます。

お礼日時:2005/04/14 23:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QGDBデバッガの使い方について

こんにちは!

現在、GDBを使用しています。
変数の値を変更する方法を教えてください。

普通、変数の値を変更する場合、

(gdb)set var 変数名=変更したい値

で変更できると思うのですが、

構造体内のある変数を変更する場合はどのようにすればよろしいでしょうか?

例えば下記の場合、
(gdb)print 構造体名.変数名
$12 = "abab"
(gdb)set var 構造体名.変数名=変更したい値

と入力すると、下記のエラーメッセージが出ます。
[Too many array elements]

何は方法はありますでしょうか?

宜しくお願いいたします。

Aベストアンサー

#1です。
>ABCD"を"EFGH"に変更したい
文字列としてセットする方法があります。
但し、char data1[4];の場合は3文字+終端NULLになりますので、
set data_info.data1="EFG"
として、次に
set data_info.data1[3]='H'
とするしかないですね。

QC言語で構造体のメンバを簡単に出力する方法ありますか?

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを簡単に取り出せるのでしょうが(間違っているかもしれません・・・)、C言語で構造体のメンバを、for文などのループを使って簡単に出力できる方法はないでしょうか?

メンバの型は、一定ではなく、char、int、double、別の構造体のポインタ型(これは出力しなくて良い)と混在しています。メンバが全て同一の型ならポインタで構造体の先頭アドレスからsizeof(メンバの型)の分インクリメントしていけば出力できそうな気もしますが、メモリ上に連続して確保されるのかも私にはわからないので困っています。

enumで列挙して・・・というのも調べてみましたが、応用は出来ないようでした。

どなたか、地道にメンバ名を書いて出力する以外の方法をご存知の方、いらっしゃいましたらお知恵をお貸しください。
よろしくお願いいたします。
※説明不足の点がありましたら補足いたします。

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを...続きを読む

Aベストアンサー

コードを書かないという方向性の提案を一つ。
デバッガに構造体の内容を出力させるというのはどうでしょうか。

struct {
int a;
char *b;
double c;
}
という型を持つ変数xがあったとして、gdbでは下記のような出力が得られます。
(gdb) print x
$1 = {
a = 123,
b = 0x2fd0 "ABC",
c = -9876.5
}

Qプログラムの規模を表す単位「k」とはどういう意味ですか?

よくプログラムの規模をあらわす数値の単位として「k(ケイ)」が使われるみたいですが、どういう意味なのでしょうか。

k=1000なので、例えば100kだとするとソースが10万行あるシステムということでしょうか??

よろしくお願いいたします。

Aベストアンサー

KSならば、キロステップ
KLならば、キロライン
KBならば、キロバイト
Kだけでは判断が付かないですね。

キロステップとキロラインは、1行1命令であれば同じになります。
a=b;c=d;e=f;
などと書かれているソースがあれば、1ラインですが3ステップになるので、差が生まれます。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む


人気Q&Aランキング