2016-06-20 13 views
-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; 
} 

Watch Values

+0

自分でコンパイルして実行してクラッシュすることができる**完全な**プログラムを投稿してください。このようなバグでは、根本的な原因は、ほとんどの場合、問題が顕在化している場所から遠く離れていることが分かります。可能であれば、非ISO Cライブラリ関数のすべての使用を削除することもできます(たとえば、 'OutputDebugString'へのすべての呼び出しを' printf'や 'puts'で置き換えるなど)。 – zwol

+0

これを普通のコンパイラでコンパイルすると、すぐにエラーが表示されるフォーマット文字列チェックの喜びが得られます。 – EOF

+0

@EOFあなたのコメントはありませんでした。 –

答えて

3
wsprintf(temp, "%s=%ld",*(char *)variable->signature, *(long *)variable->variable); 

signatureフィールドがchar *です。これを省略するとcharとなります。しかし、%sフォーマット指定子にはchar *が必要です。修正は、逆参照を削除することによってその行を変更することです(キャストも不要です)。

wsprintf(temp, "%s=%ld", variable->signature, *(long *)variable->variable); 
関連する問題