这个C代码中导致分段错误的原因是什么?

编辑:感谢迄今为止的答案,至less我现在可以编译它,但我仍然得到一个分割错误。

对于编译,我使用以下行:

gcc -g -O0 -I../include -L../ test.c -static -lrt 

源代码如下:

 #include <sys/time.h> #include <time.h> #include <stdio.h> struct timespec *diff(struct timespec *start, struct timespec *end); int main() { struct timespec time1, time2; int i; int temp = 0; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for (i = 0; i< 242000000; i++) temp+=temp; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); printf("sec: %d, nsec: %f",diff(&time1,&time2)->tv_sec, diff(&time1,&time2)->tv_nsec); //cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl; return 0; } struct timespec *diff(struct timespec *start, struct timespec *end) { struct timespec *temp; if ((end->tv_nsec-start->tv_nsec)<0) { temp->tv_sec = end->tv_sec-start->tv_sec-1; temp->tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec; } else { temp->tv_sec = end->tv_sec-start->tv_sec; temp->tv_nsec = end->tv_nsec-start->tv_nsec; } return temp; } 

我现在得到以下警告:

 test.c: In function 'main': test.c:17: warning: format '%d' expects type 'int', but argument 2 has type '__time_t' test.c:17: warning: format '%f' expects type 'double', but argument 3 has type 'long int' 

分割错误肯定是由我对结构的处理造成的。 很久以前,我最后不得不处理C ….

非常感谢,马库斯

你的diff函数的签名是timespec diff(timespec start, timespec end) ,它应该是struct timespec diff(struct timespec start, struct timespec end)


编辑你的差异函数是分配给一个未初始化的结构指针,你可能想要改变它像下面的东西。

 void diff(struct timespec *start, struct timespec *end, struct timespec *result); int main() { struct timespec time1, time2, result; int i; int temp = 0; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for (i = 0; i< 242000000; i++) temp+=temp; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); diff(&time1, &time2, &result); printf("sec: %ld, nsec: %ld", (long int)result.tv_sec, (long int)result.tv_nsec); return 0; } void diff(struct timespec *start, struct timespec *end, struct timespec * result) { if ((end->tv_nsec-start->tv_nsec)<0) { result->tv_sec = end->tv_sec-start->tv_sec-1; result->tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec; } else { result->tv_sec = end->tv_sec-start->tv_sec; result->tv_nsec = end->tv_nsec-start->tv_nsec; } } 

根据您的需要,您可能只是想要像这样产生经过的时间:

double t_ns = (double)(end.tv_sec - start.tv_sec) * 1.0e9 + (double)(end.tv_nsec - start.tv_nsec); // get elapsed time in ns

此外,FWIW,我使用CLOCK_PROCESS_CPUTIME_ID – 它似乎提供更好的准确性和分辨率在我尝试过的各种基于Linux的系统上:

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

// ... stuff ... //

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);

您必须在timespec之前添加struct关键字。 例如

 struct timespec diff(struct timespec start, struct timespec end); 

您正在编译它为C( gcc.c扩展名),但看起来像你正在编写C ++(其中struct可以提交时声明变量)。

另外,在C中,我们通常不会按价值传递结构。

另外一个提示就是要始终以高警示水平进行编译,至少要-Wall -pedantic ,才能尽早发现问题。

我想你想让diff()返回一个动态的或静态分配的指针。

尝试(评论中的建议):

 struct timespec *diff(struct timespec *start, struct timespec *end) { struct timespec *temp; /* allocate temp to be sizeof(struct timespec) and zero it out */ temp = malloc(sizeof(struct timespec)); /* Of course, deal with malloc (or calloc) failing */ memset(tmp, 0, sizeof(struct timespec)); if ((end->tv_nsec-start->tv_nsec)<0) { temp->tv_sec = end->tv_sec-start->tv_sec-1; temp->tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec; } else { temp->tv_sec = end->tv_sec-start->tv_sec; temp->tv_nsec = end->tv_nsec-start->tv_nsec; } return temp; /* Make sure caller frees the returned pointer */ } 

如果动态分配是禁忌,那么:

 static struct timespec temp; /*zero it out, watch concurrency too! */ .... temp.tv_sec = end->tv_sec-start->tv_sec; /* Make sure caller does NOT free (or modify) the pointer */ return temp; 

你需要返回一个指针(不管分配的),这个指针实际上可以被调用者访问。 或者,使*温度全球。