VS17没有初始化指针

时间:2017-12-22 15:00:40

标签: c struct visual-studio-2017

我的问题是这个代码在VS 2017中不起作用,而在CLion中它起作用。 VS说:

  

严重级代码描述项目文件行抑制状态   错误(有效)E0144
  类型void *的值不能用于初始化类型queue_t*

的实体

因此程序没有分配内存。

此外,上述示例中的每个指针都不起作用。

有人在这里知道为什么会这样,为什么VS认为这会是void

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

struct packet_t {
    double d;
    int i;
    long l;
    char *p;
    struct queue_t *queue;
};

struct queue_t {
    char *name;
    int size;
    int entries;
    double time;
    struct packet_t **packets;
    int read;
    int write;
    long lost;
    long total;
};


int decision = -1;
int isRunning = 1;

void logError(char message[]) {
    printf("ERROR: %s", message);
}

struct queue_t *queue_create(char *name, int size) {
    struct queue_t *q = malloc(sizeof(struct queue_t));

    if (!q) {
        logError("could not allocate memory!\n");
        return 0;
    }
    else {
        q->name = name;
        q->size = size;
        q->entries = 0;
        q->read = 0;
        q->write = 0;
        q->total = 0;
        q->lost = 0;

        q->packets = malloc(size * sizeof(struct packet_t *));

        if (!q->packets) {
            logError("could not allocate memory!\n");
            free(q);
            return 0;
        }

        struct packet_t **current;
        for (int i = 0; i < size; i++) {
            current = q->packets + i;
            *current = NULL;
        }
    }
    return q;
}

int packet_destroy(struct packet_t *packet) {
    //TODO test if deleted ?
    if (packet) {
        free(packet);
        return 1;
    }
    return 0;
}

long queue_store(struct queue_t *queue, struct packet_t *packet) {
    if (queue->entries < queue->size) {
        packet->queue = queue;
        *(queue->packets + queue->write) = packet;

        queue->write++;

        if (queue->write == queue->size) {
            queue->write = 0;
        }

        queue->total++;
        queue->entries++;

        return queue->total;
    }
    //cant save packet ->destroy
    packet_destroy(packet);
    queue->lost++;
    return 0;
}

struct packet_t *queue_retrieve(struct queue_t *queue) {
    if (queue->entries == 0) return NULL;

    struct packet_t **current = queue->packets + queue->read;
    struct packet_t *packet = *current;

    *current = NULL;
    if (packet->queue) {
        packet->queue = NULL;
    }
    queue->entries--;

    queue->read++;
    if (queue->read == queue->size) {
        queue->read = 0;
    }

    return packet;
}

struct packet_t *packet_create(int i, double d, long l, char *p) {
    struct packet_t *new = malloc(sizeof(struct packet_t));
    if (new) {
        new->i = i;
        new->d = d;
        new->l = l;
        new->p = p;
    }
    else {
        logError("failed to allocate memory");
    }

    return new;
}

int queue_destroy(struct queue_t *queue) {
    if (!queue) {
        logError("could not find queue!");
        return 0;
    }
    struct packet_t *p;

    for (int i = 0; i < queue->size; i++) {
        p = *(queue->packets + i);
        packet_destroy(p);
    }

    //TODO test if not needed as it's already free'd in packet_destroy
    free(queue->packets);
    free(queue);
    return 0;
}

long test_queue(int val) {
    int sum = 0, finalTime = 0;
    clock_t startTime, finalTicks;
    startTime = clock();

    while (finalTime < val) {
        struct queue_t *q = queue_create("test", 10);
        queue_destroy(
            sum++;
        finalTicks = (clock() - startTime);
        //        printf("ticks: %d\n", finalTicks);
        finalTime = (int)floor((finalTicks / (double)CLOCKS_PER_SEC));
        //        printf("time: %d\n", finalTime);
    }

    printf("Runtime: %d\n seconds", finalTime);
    printf("Added and removed %d queues\n", sum);
}

long test_packets(int val) {
    int finalTime = 0;
    struct queue_t *q = queue_create("test", 10);
    clock_t startTime, finalTicks;
    startTime = clock();

    while (finalTime < val) {
        struct packet_t *t = packet_create(finalTime, finalTime + 1, finalTime + 2, NULL);
        queue_store(q, t);
        packet_destroy(queue_retrieve(q));
        finalTicks = (clock() - startTime);
        //        printf("ticks: %d\n", finalTicks);
        finalTime = (int)floor((finalTicks / (double)CLOCKS_PER_SEC));
        //        printf("time: %d\n", finalTime);
    }

    printf("Runtime: %d\n", finalTime);
    printf("Successfully added %li entries\n", q->total);
    printf("Failed to add %li entries\n", q->lost);

    queue_destroy(q);
}

void resetDecision() {
    decision = -1;
    isRunning = 1;
}

void checkDecision() {
    while (decision != 0 && decision != 1 && decision != 2) {
        printf("Select option:\n (1) Run queue test \n (2) Run packet test \n(0) to cancel \n");
        scanf("%d", &decision);
    }
    if (decision == 0) {
        isRunning = 0;
    }
    else if (decision == 1) {
        int val = 0;
        while (val <= 0) {
            printf("Enter the time to test");
            scanf("%d", &val);
        }
        printf("Running test for %d seconds....\n", val);
        test_queue(val);
    }
    else if (decision == 2) {
        int val = 0;
        while (val <= 0) {
            printf("Enter the time to test");
            scanf("%d", &val);
        }
        printf("Running test for %d seconds....\n", val);
        test_packets(val);
    }

    if (decision != 0)
        resetDecision();
}

int main() {
    while (isRunning) {
        checkDecision();
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您正在将程序编译为C ++程序。在C ++中,没有从类型void *到其他对象类型的指针的隐式转换。

所以你需要使用像

这样的显式转换来编写
struct queue_t *q = ( struct queue_t * )malloc(sizeof(struct queue_t));

或者您应该将您的程序视为C ++程序,并使用operator new而不是C函数malloc。