powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / пара вопросов по maloc и free.
14 сообщений из 14, страница 1 из 1
пара вопросов по maloc и free.
    #39981121
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот 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
пара вопросов по maloc и free.
    #39981124
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, сорян за орф. ошибку в названии темы :)
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981151
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
** удалено **
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981166
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. будет ли (nlist*)malloc(sizeof(*np)) аналогично (nlist*)malloc(sizeof(nlist)) ? мне больше нравится вариант (nlist*)malloc(sizeof(nlist)), но верно ли ?

да

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

Ни зачем, просто так. блаж автора кода.
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981167
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу первого вопроса, будет одно и то же
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
пара вопросов по maloc и free.
    #39981202
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, спасибо.
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981203
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab


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



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

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

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

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

Я имею ввиду: зачем вам изучать Си, да ещё и часами думать над чем-то там по поводу Си?
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981419
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
ну вообще-то, я начала с Unix/Linux (по работе и по интересам)
следующий шаг это С (потому что иначе дальше никак)
чтобы разобраться - нужно думать, и часами, и днями, и неделями (потому что иначе дальше никак)
а с этим конкретным примером, я разобралась для самоконтроля
...
Рейтинг: 0 / 0
пара вопросов по maloc и free.
    #39981445
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / пара вопросов по maloc и free.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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