Текущий код имеет неопределенное поведение, поскольку вы возвращаете указатель на объект с автоматическим хранением, который выйдет из области видимости, когда функция вернется.
Существует несколько способов решения этой проблемы:
Вы можете указать reg
static
класс хранения. Вернуть указатель на reg
было бы нормально, но содержимое будет перезаписано последующими вызовами на printRegister
, поэтому вы не можете использовать printRegister
несколько раз в качестве аргументов для одного printf
вызова.
вы можете вернуть выделенную копию reg
, но вызывающей стороне потребуется освободить этот блок памяти, чтобы избежать утечек памяти. Это делает его громоздким для вашей цели.
Вы можете изменить прототип на printRegister
, чтобы взять указатель на массив назначения и вернуть его после сохранения текстового представления имени регистра. Обратите внимание, что вам понадобятся отдельные массивы для нескольких вызовов на printRegister
в одном вызове printf
.
, поскольку существует только 33 возможных строки, вы можете вернуть строковые константы. Это простое и эффективное решение, но рекомендуется изменить тип возвращаемого значения на const char *
.
Вот реализация последнего подхода:
const char *printRegister(int num) {
static const char * const regname[] = {
"$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3",
"$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
"$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7",
"$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra",
};
return (num >= 0 && num < 32) ? regname[num] : "error";
}