次のコードに問題があります。
for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}
正常にコンパイルされますが、実行すると、悪名高い「0XC0000005 アクセス違反」エラーが発生します。b を NULL、""、"0"、0 などに設定しようとしましたが、"0XC0000005 Access Violation" エラーまたは "Expression: string != NULL.
次のコードに問題があります。
for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}
正常にコンパイルされますが、実行すると、悪名高い「0XC0000005 アクセス違反」エラーが発生します。b を NULL、""、"0"、0 などに設定しようとしましたが、"0XC0000005 Access Violation" エラーまたは "Expression: string != NULL.
sprintf
最初のパラメーターとして渡す既存のバッファーにデータを書き込みます。現在、bの値をまったく指定していません。つまり、(CのIIRC)値は何でもかまいません。NULL または 0 に設定するとsprintf
、アドレス 0 からメモリに書き込もうとします。
sprintf が書き込みできるように、適切なサイズのバッファーを作成する必要があります。例えば:
for(i = 0;(i - 1)< n;i++)
{
char b[10];
sprintf(b, "%d", i);
}
もちろん、それが実際にバッファをどのように割り当てたいかは、実際のコードが結果に対して何をしたいかによって異なります。
うーん...初期化またはスペースの割り当てを行っていないため、bへのポインターにはガベージが含まれています。Springtf では、宛先バッファー スペースを割り当てておく必要があります...
少なくとも、char * だけでなく、char b[50] などの最大サイズが必要です。
char* は、char または char 配列への初期化されていないポインターです。バッファ char[10] を定義する必要があります。そうしないと、sprintf のターゲット アドレスが未定義になります。
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, ...);
どうもありがとうございました!char* が必要だったので、コードを次のように書き直しました。
for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}
そしてそれは魅力のように機能します。やっと自分の人生を歩めるようになりました!改めまして、誠にありがとうございました!