C 无法将元素从“我的队列”中出列;“无效表达式”的无效使用;

C 无法将元素从“我的队列”中出列;“无效表达式”的无效使用;,c,struct,void,C,Struct,Void,我从一些旧的回购协议中获得了一个队列文件,但没有任何文档,我正试图从中对数据进行排队和解排队 .h文件如下所示 #include"limits.h" #include"stdio.h" #include"pthread.h" #include"unistd.h" #include"stdlib.h" #include"string.h" #include"time.h

我从一些旧的回购协议中获得了一个队列文件,但没有任何文档,我正试图从中对数据进行排队和解排队

.h文件如下所示

#include"limits.h"
#include"stdio.h"
#include"pthread.h"
#include"unistd.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
pthread_mutex_t lock;


typedef struct{
    int* message;
    void*in_array;
}data_pack;

 data_pack* createpack()
{

     data_pack* pack = malloc(sizeof( data_pack));
     return pack;
}

// Queue Structure
struct Queue {
    int front, rear, size; // front, rare and the size of the Queue
    unsigned long long capacity; // stores the capacity of the Queue
    data_pack** array; //2D array to store the array of arrays
    int* array_sizes; //1D array to store the number of elements of each array
    data_pack** remArray; //2D array to store the remaining array of arrays(used for flush)
};


// Creates a Queue
struct Queue* createQueue()
{
    struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->front = queue->size = 0;
    queue->capacity = queue->size + 1;
    queue->rear = queue->capacity - 1;
    queue->array = (data_pack **)malloc(queue->capacity * sizeof(data_pack));// changed to my struct
    queue->array_sizes = (int *)malloc(queue->capacity * sizeof(int));



    if (pthread_mutex_init(&lock, NULL) != 0) {
            printf("\n mutex init has failed\n");
            return 0;
        }
    return queue;
}

// Queue is empty when size is 0
int isEmpty(struct Queue* queue)
{

    return (queue->size == 0);

}

// Function to add an array to the queue.
// It changes rear and size
void enqueue(struct Queue* queue, data_pack arr[], int n)
{
    int i=0;
    pthread_mutex_lock(&lock);// lock variables
    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->array[queue->rear] = (data_pack *)malloc(n*sizeof(data_pack));
    if(queue->array[queue->rear]==NULL) printf("Error in memory\n");
    for(i=0;i<n;i++){
        queue->array[queue->rear][i] = arr[i];// u need to input struct here

    }
    queue->array_sizes[queue->rear] = n;
    queue->size = queue->size + 1;
    queue->capacity = queue->capacity + 1;
    queue->array = (data_pack**)realloc(queue->array,queue->capacity*sizeof(data_pack));
    if(queue->array == NULL) printf("Not 2d array");
    queue->array_sizes = (int*)realloc(queue->array_sizes,queue->capacity*sizeof(int));
    if(queue->array_sizes == NULL) printf("not 1dn array sizes");
    pthread_mutex_unlock(&lock);// unlock variables

}

// Function to remove an array from queue.
// It changes front and size
data_pack* dequeue(struct Queue* queue)
{
    int i=0;
    pthread_mutex_lock(&lock);// lock variables
    int len = queue->array_sizes[queue->front];
    data_pack* deqArray = (data_pack*)malloc(len*sizeof(data_pack));
    if (isEmpty(queue))
        return 0;

    for( i=0;i<queue->array_sizes[queue->front];i++){

        deqArray[i] = queue->array[queue->front][i];
    }


    queue->front = (queue->front + 1) % queue->capacity;
    queue->size = queue->size - 1;
    pthread_mutex_unlock(&lock);// unlock variables
    free(queue->array[queue->front-1]);

    return deqArray;
}

// Function to flush all the arrays and its elements from the queue.
data_pack** flush(struct Queue* queue)
{
    int i=0;
    int j=0;
    queue->remArray = (data_pack **)malloc(queue->size * sizeof(data_pack));
    int k=0;
    for( i=queue->front;i<=queue->rear;i++){
        int len = queue->array_sizes[i];
        queue->remArray[k] = (data_pack *)malloc(len*sizeof(data_pack));
        for( j=0;j<len;j++){

            //queue->remArray[k][j] = queue->array[i][j];
        }
        free(queue->array[i]);

        k++;
    }
    free(queue->array);
    free(queue->array_sizes);
    queue->front = queue->size = 0;
    queue->capacity = queue->size + 1;
    queue->rear = queue->capacity - 1;
    queue->array_sizes = (int *)malloc(1 * sizeof(int));
    queue->array = (data_pack **)malloc(1 * sizeof(data_pack));
    return queue->remArray;
}

// Function to know number of arrays in queue
int no_elements(struct Queue* queue)
{

    return queue->size;


}
解释我的代码

-我正在尝试将一个数组放入队列,它是由200个元素组成的int数组

我正在用所需信息(如大小、命令和实际数据)更新结构数据

这个队列利用一个结构来传递数据,所以我将我的结构数据更新到此结构

然后调用排队函数

然后我检查队列大小,它是否正确更新

我正在尝试将数据出列

在这里,我将数据转换为struct,它是发送方数据

但在这一点上,我得到的错误是无效使用Void表达式

为什么会出现这样的错误?

在这一行:

dat = ((SenderData * )(rec_data -> in_array)[0]);
数组下标运算符的优先级高于类型转换运算符。所以首先要计算的是
rec\u data->in\u array[0]
。这将取消引用不允许的
void*

您需要先使用括号来应用强制转换:

dat = ((SenderData *)(rec_data->in_array))[0];
或者使用解引用运算符而不是数组索引:

dat = *(SenderData *)rec_data->in_array;

@RHKP您已将要发送的数据定义为无效的零长度数组。将大小更改为1或使其不是数组,并在需要时传递其地址;并将更新部分更改为-data\u to\u send->message=20;数据发送->在数组中=&data;此时尝试运行,我得到--0[main]nwudp908 cygwin_异常::open_stackdumpfile:将堆栈跟踪转储到nwudp.exe。stackdump@RHKP现在您正在取消对空指针的引用,因为
data\u to\u send
不指向任何地方。让它不是一个指针。对此我很抱歉,我是新来的C你是说数据包数据发送@RHKP是,它当前是一个未初始化的指针。让它不是指针。
dat = *(SenderData *)rec_data->in_array;