У меня в моем коде происходит нечетное поведение, которое, похоже, связано с использованием общего указателя, хотя на самом деле я абсолютно не уверен. У меня есть довольно стандартный структур, которые выглядят следующим образом:Неожиданное поведение размера указателя структуры C
typedef struct {
char* name;
PyAutoCFunc ac_func;
void (*func)();
PyAutoType type_id;
int num_args;
PyAutoType arg_types[MAX_ARG_NUM];
} func_entry;
static func_entry* func_entries;
Я хранящий статический указатель на массив этих элементов структуры, которая выделяется в куче. В точке, где я создаю новый элемент этого массива и вставить его, его значения выглядят так ...
func_entry new_fe;
new_fe.name = malloc(strlen(name) + 1);
strcpy(new_fe.name, name);
... // Init rest of struct
func_entries[num_func_entries] = new_fe;
num_func_entries++;
func_entry* fe = &func_entries[num_func_entries-1];
printf("Setting function '%s' at address '%p', name address '%p'\n", name, fe, fe->name);
Воспроизводит.
>>> Setting function 'graphics_viewport_set_title' at address '0xfe2d40', name address '0xe40fe0'
Обратите внимание на размер и значение fe-> name. Затем я сохраняю этот указатель в хэш-таблицу для последующего извлечения. В хэш-таблице это сохраняется как простая пустота *. Позже, когда я извлекаю указатель из хэш-таблицы, происходит странная вещь.
func_entry* fe = PyAutoHashtable_Get(func_table, c_func_name);
printf("Getting function '%s' at address '%p', name address '%p'\n", c_func_name, fe, fe->name);
Какие выходы.
>>> Getting function 'graphics_viewport_set_title' at address '0xfe2d40', name address '0x6e6f74656c656b73'
Адрес фе явно был в и из хеш-таблицы без проблем, но размер и адрес Fe-> имя изменилось. Еще более странно, что имя fe-> отличается от того, что было раньше, и даже другого размера. Попытка доступа к имени fe-> дает мне segfault, и я не уверен, как действовать дальше.
Из интереса это, похоже, происходит, когда я использую код в приложении с несколькими связанными библиотеками, я уверен, что весь код, который я запускаю, составляет 64 бит.
Я успешно выполнил вышеуказанный код в отдельном приложении и получил правильный указатель для имени fe-> (меньшего).
Я также работаю на Ubuntu Linux 64 бит и скомпилирован с gcc.
Это действительно то, где мое невежество С сияет, хотя, как я думаю, это может быть миллион вещей. Может ли кто-нибудь осветить какой-то свет?
Возможно, вам нужно будет указать код, который присваивает имя fe-> name. Как показано сейчас, он кажется неинициализированным. –
Адрес, кажется, изменился - 0xfe2d40! = 0x20049e0. Я согласен с Марком Уилкинсом - нам нужно увидеть больше кода (особенно PyAutoHastable_Get, но код, который устанавливает имя, тоже подозрительный). –
Добавлено в fe-> присвоение имени. На самом деле не хочу публиковать всю мою хэш-таблицу, так как на самом деле это большая часть кода (хотя я долго ее использовал без проблем). Тот факт, что он возвращает то же значение для fe, делает его менее подозрительным для меня. –