什么是导致此C代码中的段错误错误?
编辑:感谢迄今为止的答案,至少我现在可以编译它,但我仍然得到一个分割错误。什么是导致此C代码中的段错误错误?
编译我用下面的一行:
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)
。
编辑 你DIFF功能分配给未初始化的结构指针,你可能需要将其更改为类似以下内容。
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;
}
}
谢谢,它现在至少编译。剩下的唯一问题是输出值是0秒和0.00000纳秒。这肯定是错误的... – Marcus 2010-01-27 15:17:58
@Marcus:确保你的printf是正确的 - 如果你使用%f而不是%ld,你会得到0.0000而不是正确的值 – 2010-01-27 17:00:10
您必须在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;
你需要返回一个指针那里(但是分配的),实际上可以通过达成呼叫者,召集者。或者,使* temp全球。
根据您的需求,你可能只是想生成所经过的时间是这样的:
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);
尝试运行'gcc -C -E foo.c'并查看timespec结构是如何定义的,如果它定义的话。至少在Cygwin上,我只有'timeval',没有'timespec'。 – csl 2010-01-27 15:03:03
也添加到编译器选项。 GCC会告诉你问题是什么:) – 2010-01-27 16:40:10