2

タイムライブラリがどのように機能するかをよりよく理解し、Cについてさらに学ぶために、かなり基本的なCプログラムを作成しています。問題は、メイン関数の最後に0を返すとセグメンテーション違反が発生することです。プログラムのテキストは次のとおりです。

#include <stdio.h>
#include <time.h>

main()
{
    time_t *now;
    time(now);
    struct tm *tp = localtime(now);
    printf("%s", asctime(tp));
    return 0;
}

gdbを使用すると、10行目(0を返す)でこれまでのところすべてが正常に行われていることがわかります。私の変数は2つだけです。これらを印刷すると、次のようになります。

(gdb) print now
$7 = (time_t *) 0x7fff5fbff838
(gdb) print tp
$8 = (struct tm *) 0x7fff7b13e470
(gdb) print *now
$9 = 1345338893
(gdb) print *tp
$10 = {
  tm_sec = 53, 
  tm_min = 14, 
  tm_hour = 21, 
  tm_mday = 18, 
  tm_mon = 7, 
  tm_year = 112, 
  tm_wday = 6, 
  tm_yday = 230, 
  tm_isdst = 1, 
  tm_gmtoff = -14400, 
  tm_zone = 0x100802518 "EDT"
}

すべてがうまくいくようです。しかし、nを押すと、

Cannot access memory at address 0x50303e0d
0x0000000050303e0d in ?? ()

このエラーの原因がわかりません。mainの最後に0を返すことは、これまで私を傷つけたことはなく、メモリアドレスは私が使用しているアドレスのいずれとも一致しません。ターミナルでプログラムを実行すると、が表示されますSegmentation fault: 11。私が考えることができる唯一のことは、それがオペレーティングシステムと関係があるということです。これは、いくつかの理由で理にかなっています。比較的低いメモリアドレスと、スタック上のメモリアドレスにアクセスして戻るためにOSがスローするエラーです。に。しかし、なぜこれが起こっているのでしょうか?私はオペレーティングシステムについてあまり知りません(私はCについて学んでいるので、コース要件をスキップして、私の大学が提供するオペレーティングシステムコースを受講することができます)ので、これは本当に簡単な質問かもしれません。同じディレクトリで別のCプログラムを実行してみましたが、うまくいきました。

4

1 に答える 1

5

初期化していないnowか、スタック上で初期化したかったのかもしれません。

#include <stdio.h>
#include <time.h>

main()
{
    time_t now;
    time(&now);
    struct tm *tp = localtime(&now);
    printf("%s", asctime(tp));
    return 0;
}
于 2012-08-19T01:29:46.770 に答える