2015-09-26 2 views
-2

В проекте мне было предложено создать INT128-тип с использованием int32_t и произвести с ними постфиксные вычисления. Я использовал общий стек для отслеживания операндов. Код ниже:memcpy дает мне странные результаты со структурой

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; 

Я использовал тетср(), чтобы скопировать значение в INT128 в стек и обратно. Он работал хорошо, когда в стеке были только переменные char, но результаты полностью отличались от типа INT128. Я не очень хорошо разбираюсь в манипуляциях с памятью, поэтому, возможно, что-то я не вижу здесь. Спасибо!

Edit: Извините, ребята ... им с помощью функции ниже, чтобы нажать и данные поп из стека:

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 функционирует нормально.

+7

Показать код, который вы используете для копирования? – Gui13

+0

Информация отсутствует. Вставьте код, используемый для фактического выполнения этой memcpy. – 4pie0

ответ

0

Там проблема здесь:

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

Вы выделяете machine->dataType байт, а затем скопировать sizeof machine->dataType байт. Это могут быть разные величины, вызывающие переполнение буфера или вызывающие плохое поведение из-за отсутствия копирования достаточного количества байтов.

Возможно, вы, вероятно, не использовали sizeof во второй строке.

+0

О, ничего себе ... прямо на отметке! Все эти манипуляции с памятью иногда меня теряют ... Прошу прощения за louzy code, я должен был это увидеть ... Спасибо! –

Смежные вопросы