memcpy 给了我奇怪的结构结果
memcpy gives me weird results with struct
在一个项目中,我被要求使用 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));
并且使用 push/pop 功能正常。
这里有问题:
newNode->value = malloc(machine->dataType);
memcpy(newNode->value,pushed,sizeof(machine->dataType));
您分配 machine->dataType
字节,但随后复制 sizeof machine->dataType
字节。这些可能是不同的数量,要么导致缓冲区溢出,要么由于没有复制足够的字节而导致不良行为。
我猜你可能不想在第二行使用 sizeof
。
在一个项目中,我被要求使用 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));
并且使用 push/pop 功能正常。
这里有问题:
newNode->value = malloc(machine->dataType);
memcpy(newNode->value,pushed,sizeof(machine->dataType));
您分配 machine->dataType
字节,但随后复制 sizeof machine->dataType
字节。这些可能是不同的数量,要么导致缓冲区溢出,要么由于没有复制足够的字节而导致不良行为。
我猜你可能不想在第二行使用 sizeof
。