従うコードスニペット。
char * の数を格納する構造体 (コード例にはクラスがあり、両方を試し、同じ効果があります) があります。それらのほとんどを = ""; に初期化するクラスのコンストラクターを作成しました。クラスのインスタンスのそのメンバーを変更しようとすると、strncpy などのすべてのレポート アクセスが拒否されました。これらの関数は、内部の構造体/クラス メンバー関数のスコープで使用すると、アクセスが拒否されたと報告することさえあります。
構造体/クラスの char * メンバーを持つことは大したことではなく、特別なことではないと私の仮定でした (使用する前のある時点で初期化する必要があり、特定の時点で破棄する必要がある char へのポインターであることを除けば) )。
誰かが私の仮定が間違っている場所を教えてくれ、何が起こっているのかを明確にする文献を教えてくれたら幸いです. 現在、vs2008 フル エディションでコードをコンパイルしています。
このコードを実行すると、特定のメモリ ロケーションへのアクセスが拒否されたというランタイム エラーが発生することが予想されます。
また、char * mystr を作成すると、後で mystr = ""; と言ったときに、mystr が使用されるようにメモリが初期化されます。
また、私はばかではないと思いたいのですが、ローカルウィンドウを使用して特定の変数の正確なメモリ内アドレスを決定しようとすると、メモリがどこにあるかを教えてくれるアイデアが得られないようですです。私はメモリ ウィンドウで幸運を得る必要があります。しかたがない。
ヘルプ!前もって感謝します。私はこれらの愚かな char * を扱うのが嫌いです。なぜなら、私はいつも何らかの形でそれらを台無しにしてしまうからです。これを変更して、彼らが私をイライラさせるのではなく、ツールのように命令できるようにしたいと考えています。
ご検討いただきありがとうございます。ジョシュ
#include <stdio.h>
#include <string.h>
class mystruct {
public:
int A;
char* B;
char* C;
mystruct() {
A = 0xFE;
B = new char[32];
B = "";
C = "test";
}
void test(char *input) {
strncpy(B,input, strlen(input));
}
};
int main(char* argv[], int argc) {
mystruct work;
char wtf[32];
// work.A = 0xbb;
work.test("gotchabitch!");
// sprintf(wtf, "address of work is %x" , &work);
// strncpy(work.C,"gotchabitch!\0",strlen("gotchabitch!\0"));
strncpy(work.B,"gotchabitch!",strlen("gotchabitch!"));
printf("%d;%s;%s;", work.A, work.B, work.C);
return 0;
}
すべてへの応答: わかりました。文字列リテラルを char * に代入すると、実際には char * const B = "something" と言っていることがわかりました。(前者が変更できないメモリへのポインタであるのに対し、後者はアドレスを変更できないポインタである const char * B = something とは異なりますか?)。いずれにせよ、これは私が得たエラーメッセージを説明しています。ありがとうございました。