みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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
*/

投稿日時 - 2017-09-06 02:03:27

QNo.9371433

困ってます

質問者が選んだベストアンサー

time_tは2038年問題の対処として64bitに拡張された処理系が多くなっています。
time_tが64bit、intが32bitの場合、printfの書式として"%d"を指定してtime_tの値を渡すと、printfはtime_tの最初の32bitだけを整数として処理して、残りの32bitが残った状態になります。"%d"に続けて他の書式を指定していると、printfは残った32bit分のデータが次の書式のデータだとして処理するため、データがずれて正しい表示ができなくなります。
printfの書式の最後がtime_tのデータの場合は、32bit分残ったデータがあっても使われないだけなので、動作に支障がないように見えます。

投稿日時 - 2017-09-06 11:57:00

お礼

ご回答ありがとうございます。これで解決しました。
vcは他のC 言語とは実装が違っていたのですね。
恥ずかしながら、64bitの可能性を失念していました。
sizeof()で確認しておくべきでした。
本当にありがとうございます。

投稿日時 - 2017-09-06 21:44:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

異常動作ではありません。
time_t型を"%d"で出力しようとしているからです。
time_t型がint型とサイズか同じか調べてみてください。

HP-UXが動作しているコンピュータのCPUはItanium系ですか?

投稿日時 - 2017-09-06 03:32:10

お礼

ご回答ありがとうございます。
vcのTime_tが64bitであることに気づいていませんでした。
HPーUXはご想像の通りItaniumで動いています。

投稿日時 - 2017-09-06 21:50:53

あなたにオススメの質問