anonymous
написал 25 апреля 2006 года в 17:17 (696 просмотров)
Ведет себя
неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.
Данный код не работает, как мне надо: срабатывает assert().
Хочу, что бы выделялась память под каждый из указатель в массиве. Где я допустил ошибку? И как ее исправить? Спасибо.
#include #include #include typedef enum { TOKEN_INT, TOKEN_CHR, TOKEN_DOUBLE, TOKEN_NONE } token_t; typedef struct { token_t type; void* value; } pair_t; void initpair(pair_t* arr) { while( arr->type != TOKEN_NONE ){ switch(arr->type){ case TOKEN_INT: arr->value = (int *)malloc(sizeof(int)); break; case TOKEN_DOUBLE: arr->value = (double *)malloc(sizeof(double)); break; case TOKEN_CHR: arr->value = (char *)malloc(sizeof(char)); break; default: break; } arr++; } } void freepair(pair_t* arr) { while( arr->type != TOKEN_NONE ) free( arr->value ); } int* iv = NULL; double* dv = NULL; char* cv = NULL; pair_t arr[] = { { TOKEN_DOUBLE, &dv }, { TOKEN_CHR, &cv }, { TOKEN_INT, &iv }, { TOKEN_NONE, NULL } }; int main(void) { initpair(arr); assert( iv != NULL ); freepair(arr); return 0; }
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Более извращенского способа я не видел.
Из кода видно, что iv всегда NULL.
Поскольку её никто не меняет, а просто изменяется значение:
Вот тут очепятка вкралась. Правда все равно она проблему не решает:
Это не важно. меня интересует почему не работает как надо :(.
Это КАК так??? :o ведь я же память для нее выделяю.
Ну представь есть у тебя переменная iv — указатель на адрес NULL, она хранится в стеке, и у нее адрес предположим 0xffff, а есть переменная (грубо) arr->value, после передачи в массив &iv ты получаешь, что arr->value = 0xffff. Затем в функции выделяется кусок памяти с адресом 0xdddd и arr->value = 0xdddd, а iv как был так и остался равным нулю, его никто не изменял.
Грубо, но по-моему я ничего не упустил, и особо не наврал.
iliya, садись. Молодец, 5 баллов. :)
а потому, что
надо писать так:
ну или не совсем так, может звёздочек поменьше. И нефиг пользоваться void*, пока в этом нету необходимости. Тогда тебе компилятор такую пачку варнингов выдаст, что пока их разгребёшь, сам поймёшь что же хочешь сделать.
Вот так и пишутся плохие, никому не нужные и не работающие программы: один написал непонятный код, второй исправил, вот и получился GTK.
P.S.
Ничего против gtk , а также разработчиков и людей так или иначе связаных с участием в столь важном и нужном для всего Linux сообщества проекте не имею и сказать не хотел.
Блин, извращенцы, откройте для себя С++.
Эээ… батенька, С++ не решает проблемы, он переносит их в другое место. И место это всем хорошо известное…
При использовании идеологии «выделение ресурсов в конструкторе, освобождение в деструкторе» (есть умное название этой идеологии, я его забыл :) ) проблема только одна. И она решается теми же смартпойнтерами.
Технология эта Resource Acquisiton Is Initialization (RAII). :)
применительно к данному топику, проблема не актуальна нисколько, так что C++ ты сюда зря примазал.
Всем спасибо. Вопрос снят. Разобрался ;).