解決済み

Visual Cのstat構造体の動作

  • 困ってます
  • 質問No.9371433
  • 閲覧数246
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 100% (2/2)

はじめまして。

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

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

  • 回答No.2

ベストアンサー率 62% (407/654)

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分残ったデータがあっても使われないだけなので、動作に支障がないように見えます。
お礼コメント
yohmi88

お礼率 100% (2/2)

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

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 28% (1336/4688)

コンピューター カテゴリマスター
異常動作ではありません。
time_t型を"%d"で出力しようとしているからです。
time_t型がint型とサイズか同じか調べてみてください。

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

お礼率 100% (2/2)

ご回答ありがとうございます。
vcのTime_tが64bitであることに気づいていませんでした。
HPーUXはご想像の通りItaniumで動いています。
投稿日時 - 2017-09-06 21:50:53
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ