-1

以下のコードがあり、int milli =20 行目 (一番下の近く) なしで実行すると問題なく実行されますが、関数の結果を変数 ( milli) に代入すると、セグメンテーション違反がスローされます。セグメンテーション違反を引き起こす違いが何であるかわかりません。

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

// convert a timeval and time to milliseconds of today
int seconds_of_day(struct timeval *sec, struct tm *tim){
    long int milli_since_epoch = (sec->tv_sec * 1000)+(sec->tv_usec/100);
    return 0; // this is return 0 only for debugging
}

int main(){
    struct timeval *timeval_struct;
    time_t rawtime;
    struct tm *tm_struct;

    gettimeofday(timeval_struct, NULL);
    time(&rawtime);
    tm_struct = gmtime(&rawtime);

    int milli = seconds_of_day(timeval_struct, tm_struct);

    return(0);
}
4

3 に答える 3

3

どこtimeval_structを指す?そのためのスペースを割り当てませんでした。を使用するかmalloc、 a を宣言してstruct timeval timeval_struct;、そのアドレスを に渡しますgettimeofday(&timeval_struct, NULL)

于 2013-06-02T11:15:29.663 に答える
2

timeval_structポインターが初期化されていないため、コードがクラッシュします。を割り当てるstruct timevalか、次のようにポインターの代わりに自動変数を使用する必要があります。

struct timeval timeval_struct;
...
gettimeofday(&timeval_struct, NULL);
...
int milli = seconds_of_day(&timeval_struct, tm_struct);

ideone のデモ

于 2013-06-02T11:15:21.230 に答える
1

ポインタとして宣言timeval_structしましたが、メモリが割り当てられていません。したがって、プログラムが所有していない未定義のメモリを指しています。seconds_of_day()構造体にアクセスしようとするとクラッシュしますtimeval

timeval_structポインターとしてではなく、実際の構造体として宣言することで、これを修正できます。

int main() {
    struct timeval timeval_struct;  // Actual struct, not pointer.
    time_t rawtime;
    struct tm *tm_struct;

    gettimeofday(&timeval_struct, NULL);  // Pass address of struct.
    time(&rawtime);
    // This is OK: gmtime() returns a pointer to allocated memory.
    tm_struct = gmtime(&rawtime);

    // Pass address of allocated timeval_struct.
    // NOTE:  seconds_of_day() does not use tm_struct at all.
    int milli = seconds_of_day(&timeval_struct, tm_struct);

    return(0);
}
于 2013-06-02T11:19:23.677 に答える