Проблема в том, что tp-> mnem указывает на строковый литерал, который обычно размещается в сегменте памяти, доступном только для чтения. Поэтому незаконно перезаписывать его. Скорее всего, вам нужно сделать что-то вроде этого:
Tokens tokens;
tokens.label = "";
tokens.mnem = strdup("load");
tokens.operand = "";
Это даст вам динамически распределенный блок памяти для mnem, который вы затем можете записать в любое количество раз. Конечно, у вас также есть пара других проблем: во-первых, вам нужно помнить, чтобы освободить эту память с free
позже; во-вторых, вам нужно знать размер выделенного буфера, чтобы не перезаписывать его.
Если вы знаете, что содержимое mnem
никогда не превысит 4 байта, вы можете вместо этого изменить объявление структуры следующим образом:
typedef struct tok {
char* label;
char mnem[5]; // note: +1 byte for a NULL terminator
char* operand;
}Tokens;
Тогда вы бы инициализировали это так:
Tokens tokens;
tokens.label = "";
strcpy(tokens.mnem, "load");
tokens.operand = "";
Это освобождает вас от ответственности за управление памятью для mnem
, хотя у вас все еще есть некоторый риск переполнения буфера.