取消引用指向不完整类型错误的指针

时间:2015-08-13 15:39:39

标签: c pointers

我正在尝试将指向结构的指针转换为整数但是我在所讨论的2个指针中得到以下错误。

int value = 0;
int trig = 0;
int Echo =0;
void* threadFunc(void *args) {
   if(args!= NULL){
   struct args *pins = malloc(sizeof(args));
   trig = pins->trig1;//edited
   echo = pins->echo1;//edited
    value = setup();
   }
}

上面的代码片段是从另一个文件调用的,它创建了传递struct

的线程
struct sonicPins{
//front left.
int trig1;
int echo1;
//front right.
int trig2;
int echo2;
//rear left;
int trig3;
int echo3;
//rear right.
int trig4;
int echo4;
};

struct sonicPins *args1;
args1-> trig1 = 21;
args1->echo1 = 20;
//front right.
args1->trig2 = 16;
args1->echo2 = 12;
//rear left;
args1-> trig3 = 26;
args1->echo3 = 19;
//rear right.
args1->trig4 = 13;
args1->echo4 = 6;

if(args1!=NULL){
 pthread_create(&thr1, NULL, &threadFunc,(void*) &args1);
}

我在编译期间遇到以下错误:sonicThread.c:在函数'threadFunc'中: sonicThread.c:9:8:错误:取消引用指向不完整类型的指针 sonicThread.c:10:8:错误:取消引用指向不完整类型的指针

我多年来一直试图解决这个问题,但无济于事。

1 个答案:

答案 0 :(得分:0)

struct args *pins = malloc(sizeof(args));使用struct args,然后请求sizeof(args)struct args *是前瞻性声明;它意味着&#34; 我正在引用你将在稍后了解的东西(通过指针),但现在这不重要,只需为指针预留空间。&#34; < / p>

在您的代码中的某个时刻,现在必须有

typedef struct args {
    ....
} args;

声明struct args,其定义及其替代名称args。但是,当编译器解析struct args *pins = malloc(sizeof(args));时,它还没有看到args的定义,因此它不知道它的大小,并抱怨它。

编辑:此外,在创建传递结构的线程的函数中,您声明了struct sonicPins *args1;但不为其分配内存,但是,您就像开始为其分配值一样。太棒了,你不会遇到段错误。但无论如何,你应该这样做:

struct sonicPins *args1= malloc(sizeof(struct sonicPins));
args1->trig1 = 21;
args1->echo1 = 20;
....

现在你已经为它安全地分配了内存,你可以将它传递给线程函数。

pthread_create(&thr1, NULL, &threadFunc,(void*) &args1);

现在线程函数已经分配了内存,它不需要这样做(但这是我们先讨论的编译器错误),函数变为:

int value = 0;
int trig = 0;
int Echo =0;
void* threadFunc(struct sonicPins *args) {
   if(args!= NULL){
       trig = args->trig1;
       echo = args->echo1;
       value = setup();
   }
   /* and what does it return?? */
}

编辑:所以文件的结构必须是:

文件sonic.h包含定义:

/* file sonic.h */
typedef struct sonicPins{
    //front left.
    int trig1;
    int echo1;
    ...
} args;

文件main.c包含这个并分配存储以传递给线程函数:

/* main.c */
#include "sonic.h"

struct sonicPins *args1;

int main() {
    ...
    args1= malloc(sizeof(struct sonicPins));
    args1->trig1= 21;
    ...
    pthread_create(&thr1, NULL, threadFunc, args1);
    ...
}

带有threadFunc的文件看起来像:

/* threadFunc.c*/
#include "sonic.h"

int value = 0;
int trig = 0;
int Echo =0;
void* threadFunc(struct sonicPins *args) {
    if(args!= NULL){
        trig = args->trig1;
        echo = args->echo1;
        value = setup();
    }
}