Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / пара вопросов по maloc и free. / 14 сообщений из 14, страница 1 из 1
17.07.2020, 21:32
    #39981121
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
вот C у нас есть имеется деректива define

#define IN 1
в результате в тексте программы любое IN будет замещено на 1. (поправьте если не точен)

всю работу осуществляют 2 функции, манипулирующие с именами и замещающими их текстами. Это install(s,t), которая записывает имя s и замещающий его текст t в таблицу, где s и t - строки, и lookup(s),
осуществляющая поиск s в таблице и возвращающая указатель на место, где имя s было найдено, или NULL,
если s в таблице не оказалось.
Сам алгоритм основан на хэш-поиске: поступающее имя свертывается в неотрицательное число (хэш-код),
которое затем используется в качестве индекса в массиве указателей. Каждый элемент этого массива
является указателем на начало связанного списка блоков, описывающих имена с данным хэш-кодом. Если
элемент массива равен NULL, это значит, что имен с соответствующим хэш-кодом нет
(кстати , как вам перевод 3-го издания книги ? :) )
код прилагаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "ctype.h"
#include "string.h"
#include "stdlib.h"


#define HASHSIZE 101
struct nlist {
    struct nlist* next;
    char* name;
    char* defn;
};
static nlist* hashtab[HASHSIZE];

unsigned hash(const char* s)
{
    unsigned hashval;
    for (hashval = 0; *s != '\0'; s++)
        hashval = *s + 31 * hashval;
    return hashval % HASHSIZE;
}
nlist* lookup(const char* s)
{
    struct nlist* np;
    for (np = hashtab[hash(s)]; np != NULL; np = np->next)
        if (strcmp(s, np->name) == 0)
            return np;
    return NULL;
};

char* mystrdup(const char* s)
{
    char* p;
    p = (char*)malloc(strlen(s) + 1);
    if (p != NULL) strcpy(p, s);
    return p;

}


nlist* install(const char* name, const char* defn)
{
    nlist* np;
    unsigned hashval;
    if ((np = lookup(name)) == NULL) {
        np = (nlist*)malloc(sizeof(*np));
        if (np == NULL || (np->name = mystrdup(name)) == NULL) return NULL;
        hashval = hash(name);
        np->next = hashtab[hashval];
        hashtab[hashval] = np;
    }
    else //уже есть в таблице
        free((void*)np->defn);
    if ((np->defn = mystrdup(defn)) == NULL)
        return NULL;
    return np;
}

int main()
{
    
install("int","integer");
nlist* val = lookup("int");


return 0;
}



суть кода понимаю .
но есть 2 вопроса :
1. будет ли (nlist*)malloc(sizeof(*np)) аналогично (nlist*)malloc(sizeof(nlist)) ? мне больше нравится вариант (nlist*)malloc(sizeof(nlist)), но верно ли ?
2. вот таким образом "free((void*)np->defn);" уничтожается "строка" которая была зарезервирована mystrdup. вопрос зачем идет преобразование первого указателя на первый символ в (void*) ? это авторы не объясняют.
...
Рейтинг: 0 / 0
17.07.2020, 21:45
    #39981124
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
andron81, сорян за орф. ошибку в названии темы :)
...
Рейтинг: 0 / 0
17.07.2020, 23:46
    #39981151
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
** удалено **
...
Рейтинг: 0 / 0
18.07.2020, 00:35
    #39981166
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
1. будет ли (nlist*)malloc(sizeof(*np)) аналогично (nlist*)malloc(sizeof(nlist)) ? мне больше нравится вариант (nlist*)malloc(sizeof(nlist)), но верно ли ?

да

2. вот таким образом "free((void*)np->defn);" уничтожается "строка" которая была зарезервирована mystrdup. вопрос зачем идет преобразование первого указателя на первый символ в (void*) ? это авторы не объясняют.

Ни зачем, просто так. блаж автора кода.
...
Рейтинг: 0 / 0
18.07.2020, 00:44
    #39981167
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
по поводу первого вопроса, будет одно и то же
https://en.cppreference.com/w/c/memory/free int main(void)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>   
#include <stdlib.h> 

{
    int *p1 = malloc(4*sizeof(int));  // allocates enough for an array of 4 int
    int *p2 = malloc(sizeof(int[4])); // same, naming the type directly
    int *p3 = malloc(4*sizeof *p3);   // same, without repeating the type name
 
    free(p1);
    free(p2);
    free(p3);
}



это моя любимая часть кода, но я так пока не могу
Код: plaintext
1.
2.
3.
4.
    else //уже есть в таблице
        free((void*)np->defn);
    if ((np->defn = mystrdup(defn)) == NULL)
        return NULL;
...
Рейтинг: 0 / 0
18.07.2020, 08:38
    #39981202
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
MasterZiv, спасибо.
...
Рейтинг: 0 / 0
18.07.2020, 08:39
    #39981203
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
mini.weblab


это моя любимая часть кода, но я так пока не могу
Код: plaintext
1.
2.
3.
4.
    else //уже есть в таблице
        free((void*)np->defn);
    if ((np->defn = mystrdup(defn)) == NULL)
        return NULL;



спасибо ,
но поясните свой сарказм, пожалуйста :)
...
Рейтинг: 0 / 0
18.07.2020, 15:51
    #39981306
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
andron81,
я где-то час думала, как и почему это работает, пока не обратила внимание на присваивание внутри if
вынос мозга этот код
...
Рейтинг: 0 / 0
18.07.2020, 17:01
    #39981323
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
mini.weblab,

ну да . книжка суровая и старая:)
...
Рейтинг: 0 / 0
18.07.2020, 17:08
    #39981327
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
mini.weblab
andron81,
я где-то час думала, как и почему это работает, пока не обратила внимание на присваивание внутри if
вынос мозга этот код

А зачем вам всё это нужно? Вы же вроде бы веб-разработчик?
...
Рейтинг: 0 / 0
18.07.2020, 18:40
    #39981345
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
petrav,
так классный код же!
(правда, я не знаю как такое возможно было бы читать без комментов)
...
Рейтинг: 0 / 0
18.07.2020, 19:03
    #39981353
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
mini.weblab
petrav,
так классный код же!
(правда, я не знаю как такое возможно было бы читать без комментов)

Привычка нужна. Я прочёл моментально.

Я имею ввиду: зачем вам изучать Си, да ещё и часами думать над чем-то там по поводу Си?
...
Рейтинг: 0 / 0
19.07.2020, 01:27
    #39981419
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
petrav,
ну вообще-то, я начала с Unix/Linux (по работе и по интересам)
следующий шаг это С (потому что иначе дальше никак)
чтобы разобраться - нужно думать, и часами, и днями, и неделями (потому что иначе дальше никак)
а с этим конкретным примером, я разобралась для самоконтроля
...
Рейтинг: 0 / 0
19.07.2020, 09:04
    #39981445
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пара вопросов по maloc и free.
mini.weblab
petrav,
ну вообще-то, я начала с Unix/Linux (по работе и по интересам)
следующий шаг это С (потому что иначе дальше никак)
чтобы разобраться - нужно думать, и часами, и днями, и неделями (потому что иначе дальше никак)
а с этим конкретным примером, я разобралась для самоконтроля

Это классика С
Код: plaintext
1.
2.
3.
if ((np->defn = mystrdup(defn)) == NULL)  return NULL;
/* точнее даже так   */
if (!(np->defn=mystrdup(defn))) return NULL;


Как говорила моя учитель по PL/1 "перфокарту нужно бить до конца, иначе колода может оказаться неподъёмной".
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / пара вопросов по maloc и free. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]