rpcgenを使用して、開発中のプログラムのクライアントとサーバーのスタブを生成しました。そのため、スタブはXDRを使用してデータをカプセル化し、ネット経由で送信します。このコードを実行すると、セグメンテーション違反がスローされます。
char *str = "Hello!";
my_remote_call(str, strlen(str));
代わりに、次のように変更しても問題はありません。
char *str = "Hello!";
char *str2 = (char*) malloc(strlen(str));
memcpy(str2, str, strlen(str));
my_remote_call(str2, strlen(str2));
GDBを使用すると、my_remote_call()によって呼び出されるxdr_u_char()関数でセグメンテーション違反が発生することがわかりました。私の質問は:
前者の場合、Hello文字列はコンパイラによって.rodataセクションに割り当てられ、後者の場合、ヒープの一部が文字列を記憶するために使用されます。xdr_u_char署名には明示的に必要なため、セグメンテーション違反が発生する可能性があります
char*
ではなく
const char*
あなたがここで見ることができるように?したがって、この場合、xdr_u_char()関数がデータを変更することを意味しますか?