1

次のコードに問題があります。

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

正常にコンパイルされますが、実行すると、悪名高い「0XC0000005 アクセス違反」エラーが発生します。b を NULL、""、"0"、0 などに設定しようとしましたが、"0XC0000005 Access Violation" エラーまたは "Expression: string != NULL.

4

5 に答える 5

7

sprintf最初のパラメーターとして渡す既存のバッファーにデータを書き込みます。現在、bの値をまったく指定していません。つまり、(CのIIRC)値は何でもかまいません。NULL または 0 に設定するとsprintf、アドレス 0 からメモリに書き込もうとします。

sprintf が書き込みできるように、適切なサイズのバッファーを作成する必要があります。例えば:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

もちろん、それが実際にバッファをどのように割り当てたいかは、実際のコードが結果に対して何をしたいかによって異なります。

于 2008-12-07T20:41:47.577 に答える
1

うーん...初期化またはスペースの割り当てを行っていないため、bへのポインターにはガベージが含まれています。Springtf では、宛先バッファー スペースを割り当てておく必要があります...

少なくとも、char * だけでなく、char b[50] などの最大サイズが必要です。

于 2008-12-07T20:39:37.270 に答える
1

char* は、char または char 配列への初期化されていないポインターです。バッファ char[10] を定義する必要があります。そうしないと、sprintf のターゲット アドレスが未定義になります。

于 2008-12-07T20:43:22.067 に答える
1

sprintf は、可能な結果を​​格納するのに十分な大きさの、既に割り当てられている文字バッファーを渡す必要があります。これはバッファ オーバーフローの影響を大きく受けます。代わりに、より安全な snprintf を使用することをお勧めします。それを行うための非効率的ですが安全な方法の1つ:

int bufsize = snprintf(NULL, 0, formatstring, ...);
char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
if (buffer == NULL) out_of_memory_error();
snprintf(buffer, bufsize+1, formatstring, ...);
于 2008-12-07T20:48:28.233 に答える
0

どうもありがとうございました!char* が必要だったので、コードを次のように書き直しました。

for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}

そしてそれは魅力のように機能します。やっと自分の人生を歩めるようになりました!改めまして、誠にありがとうございました!

于 2008-12-07T20:48:25.660 に答える