-3
タイトルはストーリーを示しています。以下は、コードとすべての依存関係です。私はウォッチウィンドウで同じ変数にアクセスすることができ、実行時にこのエラーが発生する理由がわかりません。私が見つけることができたのと同じタイトルの質問のほとんどは、ヌルアドレスがアクセスされていることに関連していましたが、ここではそうではありません。 0X00000069はアクセスできない場所です。また、ウォッチウィンドウのスクリーンショットも添付しました。アクセス違反の読み取り場所0x000000xx - c構造プロパティ - Visual Studio
typedef struct
{
void * variable; // variable address
char * signature;
char name[30];
char type[50];
} GlobalVariable;
GlobalVariable VariableTable[] =
{
{ &a, "int a = 7;", "a", "int"},
{ &ch, "char ch = 'a';", "ch", "char"},
{ NULL, NULL }
};
void PrintGlobalVariables()
{
GlobalVariable * variable = VariableTable;
int count = 0;
while(variable->variable)
{
count++;
variable++;
}
if(!count)
{
OutputDebugString("No global variables passed.\n");
return;
}
int i = 0 ;
variable = VariableTable;
char temp[MAX_PATH];
strcpy(temp, " ");
OutputDebugString("Global Variables = ");
while(variable->variable)
{
if(strcmp(trimwhitespace(variable->type),"int") == 0)
{
////////THIS IS THE STATEMENT BELOW WHERE I AM GETTING ERROR
wsprintf(temp, "%s=%ld",*(char *)variable->signature, *(long *)variable->variable);
} else
if(strcmp(trimwhitespace(variable->type),"char") == 0)
{
wsprintf(temp, "%s=%c", *(char *)variable->name, *(char *)variable->variable);
}
if((variable+1)->variable != NULL)
{
wsprintf(temp + strlen(temp), ",", "");
}
OutputDebugString(temp);
variable++;
}
OutputDebugString("\n");
}
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while(isspace(*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;
// Write new null terminator
*(end+1) = '\0';
return str;
}
自分でコンパイルして実行してクラッシュすることができる**完全な**プログラムを投稿してください。このようなバグでは、根本的な原因は、ほとんどの場合、問題が顕在化している場所から遠く離れていることが分かります。可能であれば、非ISO Cライブラリ関数のすべての使用を削除することもできます(たとえば、 'OutputDebugString'へのすべての呼び出しを' printf'や 'puts'で置き換えるなど)。 – zwol
これを普通のコンパイラでコンパイルすると、すぐにエラーが表示されるフォーマット文字列チェックの喜びが得られます。 – EOF
@EOFあなたのコメントはありませんでした。 –