在C语言中将指向结构体的指针传递给函数时出现错误

3

我正在尝试在C程序中传递指向两个struct timevals的指针到一个函数中,该函数将输出它们之间的经过时间。然而,即使我解引用这些指针,nvcc仍会抛出错误“表达式必须具有类类型”(这是一个CUDA程序)。以下是来自main()的相关代码:

struct timeval begin, end;
if (tflag) { HostStartTimer(&begin) };
// CUDA Kernel execution
if (tflag) { HostStopTimer(&begin, &end); }

HostStopTimer() 的函数定义:

void HostStopTimer(struct timeval *begin, stuct timeval *end) {
    long elapsed;
    gettimeofday(end, NULL);
    elapsed = ((*end.tv_sec - *begin.tv_sec)*1000000 + *end.tv_usec - *begin.tv_usec);
    printf("Host elapsed time: %ldus\n", elapsed);
 }

导致错误的代码是对elapsed进行赋值。我在C语言中使用结构体方面没有太多经验,更不用说将指向结构体的指针传递给函数了,所以我不确定是什么原因导致了错误。


尝试: 经过 = ((end->tv_sec - begin->tv_sec)*1000000 + end->tv_usec - begin->tv_usec); - fazo
2个回答

7
. 运算符的优先级高于 * 运算符,因此像 *end.tv_sec 这样的表达式会首先尝试计算 end.tv_sec(这是不可能的,因为 end 是一个指针),然后解引用结果。
你应该使用 (*end).tv_sec 或者 end->tv_sec

2

您应该编写elapsed = (((*end).tv_sec - (*begin).tv_sec)*1000000 + (*end).tv_usec - (*begin).tv_usec);或使用->运算符。

.运算符只能用于结构体,而不能用于指向结构体的指针,例如:(*begin).tv_sec而不是begin.tv_sec,因为begin是一个指向结构体的指针。运算符->只是上述方法的“快捷方式”,例如(*begin).tv_secbegin->tv_sec相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接