Visual Cのstat構造体の動作
はじめまして。
stat構造体をprintf系の関数で出力するときの異常動作で悩んでいます。
stat関数で読み取った複数のstat構造体の日付情報をprintf関数で
出力書式を"%d %d \n"のように連続して出力するとvisual Cだけ、
二つ目の変数が期待した通りに出力できないのでソースをいじって
どのような状態で出力できないのか確認したところ、
Visual studio 2012,2013のvisual Cに於いては、 stat構造体の
time_t型変数をprintf系関数で出力する場合、その変数以降に
続けて出力する他の変数が正常に出力できなくなることに
気づきました。これはなぜでしょう?
以下のC言語のソースの例では、先にstring変数を出力してstat構造体の
time_t型変数を出力した場合(debug2)には問題ないのに、
変数の出力順を入れ替えるとVisual Cではtime_t型変数以降は
正常に出力できません。(debug3)
尚、time_t変数のst_mtime、st_ctime共、同様の結果になります。
printfの書式通りに出力されないだけで、変数の中身は壊れていません。
// 以下サンプルソース wsttes.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#ifdef _HPUX_SOURCE //HP-UXのansi-Cでもコンパイルできるように
#define _stat stat
#endif
int main()
{
char s1[100]; // s1
struct _stat t1; // t1
strcpy(s1,"testA");
t1.st_atime=111111; // stat構造体を変数として利用しているだけ
printf("debug0 s1=%s\n",s1);
printf("debug1 t1=%d\n",t1.st_atime);
printf("debug2 s1=%s t1=%d\n",s1,t1.st_atime);
printf("debug3 t1=%d s1=%s\n",t1.st_atime,s1);
return 0;
}
/*実行結果
Borland C(BCC32)
d:\users\work\bc>wsttes
debug0 s1=testA
debug1 t1=111111
debug2 s1=testA t1=111111
debug3 t1=111111 s1=testA
Visual C(visual studio 2012 or 2013)
d:\users\work\vc>wsttes
debug0 s1=testA
debug1 t1=111111
debug2 s1=testA t1=111111
debug3 t1=111111 s1=(null) ←ここだけ異常?
HP-UX ansi-C
hp-ux % wsttes
debug0 s1=testA
debug1 t1=111111
debug2 s1=testA t1=111111
debug3 t1=111111 s1=testA
*/
お礼
とても参考になりました。 こんな初歩的な質問にもご回答いただき、嬉しいです。