在一个项目中,我被要求使用int32_t创建一个INT128类型,并对其进行后缀计算。我正在使用通用堆栈来跟踪操作数。代码如下:

typedef struct int128
{
    int32_t byteArray[4];
} INT128;


typedef struct node{
    void *value;
    struct node *bottom;

} NODE;

typedef struct stack{
    int size;
    size_t dataType;
    NODE *top;
} STACK;


我使用memcpy()将INT128的值复制到堆栈并返回。当堆栈中只有char变量时,它可以很好地工作,但是结果与INT128类型完全不同。
 我对内存操作不太熟悉,所以这里可能看不到某些东西。
  谢谢!

编辑:
抱歉,我正在使用以下功能从堆栈中推送和弹出数据:

void push(STACK *machine,void *pushed)
{
    NODE *newNode = malloc(sizeof(NODE));
    newNode->value = malloc(machine->dataType);
    memcpy(newNode->value,pushed,sizeof(machine->dataType));

    newNode->bottom = machine->top;
    machine->top = newNode;
    machine->size++;
}

void pop(STACK *machine, void *poppedValue)
{
    if(machine->top == NULL)
    {
        printf("WARNING: empty stack!\n");
    }
    else
    {
        NODE *popped = machine->top;
        memcpy(poppedValue,popped->value,machine->dataType);
        machine->top = popped->bottom;

        free(popped->value);
        free(popped);

        machine->size--;
    }
}


我正在像这样初始化堆栈:

STACK *numStack = createStack(sizeof(INT128));


并正常使用推/弹出功能。

最佳答案

这里有个问题:

newNode->value = malloc(machine->dataType);
memcpy(newNode->value,pushed,sizeof(machine->dataType));


您分配machine->dataType字节,但然后复制sizeof machine->dataType字节。这些数量可能不同,可能会导致缓冲区溢出或由于未复制足够的字节而导致不良行为。

我想您可能打算在第二行中不使用sizeof

关于c - memcpy给我的结构怪异的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32800651/

10-10 12:50