メッセージにある通り、fnameが初期化されていないので、この場合fnameは自動変数なので値は不定であり、使用すると未定義動作になります。
fnameに有効なバッファへのポインタを代入するといいでしょう。
また、特殊な環境(組み込みなど)向けのコードを書く、使わないと(理不尽に)学校の試験で減点される、など特に使いたい理由があるのでなければ、
void main()は標準ではないので使うべきではありません。
void main()をめぐるどうでもいい話 - Qiita
C言語の場合
コード:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
char* fname;
fname = malloc(32); // 十分大きな領域を確保する
if(fname==NULL){
perror("malloc");
return 1;
}
for(i=1;i<=3;i++){
sprintf(fname,"a%d.txt",i);
//fnameのファイルを開いてなんらかの処理
}
free(fname); // 領域を解放する
return 0;
}
C++の場合
コード:
#include <cstdio>
#include <cstdlib>
int main(void)
{
int i;
char* fname;
fname = new char[32]; // 十分大きな領域を確保する
for(i=1;i<=3;i++){
sprintf(fname,"a%d.txt",i);
//fnameのファイルを開いてなんらかの処理
}
delete[] fname; // 領域を解放する
return 0;
}
また、領域をわざわざ動的確保するのではなく、最初から配列を用意してもいいでしょう。
コード:
#include <stdio.h>
int main(void)
{
int i;
char fname[32]; // 十分大きな領域を確保する
for(i=1;i<=3;i++){
snprintf(fname,sizeof(fname),"a%d.txt",i); // バッファの大きさを指定できるsnprintfの方が安心
//fnameのファイルを開いてなんらかの処理
}
return 0;
}