-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,要么声明 astruct timeval timeval_struct;并将其地址传递给gettimeofday(&timeval_struct, NULL).

于 2013-06-02T11:15:29.663 回答
2

代码崩溃是因为timeval_struct指针未初始化。您需要为其分配 a 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 回答