динамическая память в си



Динамическое выделение памяти в си

Автор Supra7sky задал вопрос в разделе Другие языки и технологии

Динамическое выделение памяти, при сравнении строк. (Си без использования встр. функций) и получил лучший ответ

Ответ от Ra[гуру]
> char *pass;
> scanf("%s", &pass);
Это не будет работать!
В переменной pass мусор при создании, иначе говоря она содержит адрес какого-угодно места в памяти. Спецификатор %s требует просто адрес, а не адрес указателя, как у тебя.
Лучше не выеживаться, а таки ограничить длину пароля:
char pass[33];
scanf("%""32s", pass);
> Си без использования встр. функций
В Си нет встроенных функций. Все функции библиотечные, либо из стандартной библиотеки языка Си, либо из сторонних. В Си нет операторов выделения/освобождения динамической памяти, для этого есть библиотечные функции malloc, realloc, calloc, free.
Примитивная реализация чтения слова со стандартного ввода, используя динамическое выделение памяти:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
char *getword() {
    size_t n = 1;
    int c;
    char *s = (char *)malloc(1);
    s[0] = '';
    while ( !isspace(c = getchar()) ) {
        char *t = (char *)realloc(s, n + 1);
        if (t == NULL) {
            free(s);
            return NULL;
        }
        s = t;
        s[n - 1] = c;
        s[n++] = '';
    }
    fflush(stdin);
    return s;
}
main() {
    char *s;
    printf("word? ");
    s = getword();
    printf("'%s'
", s);
    free(s);
}
Память выделенную под строки полученные getword надо освобождать функцией free.
Сама функция плохая: обычно память выделяют и перераспределяют порциями определенного размера, а не по одному символу, как сделано здесь.

Ответ от Gvvad[гуру]
Считываеш пароль с закрывающим нулем в буфер. Перед проверкой еще посчитай количество символов. Зачем динамически выделать память непонятно.
**string это указатель на указатель, или массив массивов, или двухмерный массив.

Ответ от Niemand[гуру]
Кто дает такие идиотские задания -- "без использования встр. функций"???
Учат изобретать велосипед?
Идиоты.. .
Как ты будешь динамически выделять память без использования встроенных функций?
Ухитриться можно, но это же бред собачий...

Ответ от Николай Веселуха[гуру]
Пароли где-то хранятся, например в базе данных. Если он у вас не ограничен по размеру, то найдутся шутники, которые возьмут нетленный труд Карла Маркса в подлиннике, перемешают, в случайном порядке, с полным собранием сочинений Джоан Роулинг, удалят пробельные символы и символы конца строк, затем используют в качестве пароля. 100000 таких паролей и у вас самая большая в мире база данных!
Сравнивайте со своим замыслом.
#include <stdio.h>
#include <locale.h>
enum msg { PASSWORD, ACKKNOWLEDGEMENT, ERROR, GOOD };
#define BUF 256
void ui(short);
int compare(char *, char *); // функция сраниивает две строки на эквивалентность
int main() {
    char password[BUF], acknowledgement[BUF];
    ui(PASSWORD);
    scanf_s("%s", password);
    ui(ACKKNOWLEDGEMENT);
    scanf_s("%s", acknowledgement);
    while (!compare(password, acknowledgement)) {
        ui(ERROR);
        scanf_s("%s", acknowledgement);
    }
    ui(GOOD);
    getchar(); getchar();
    return 0;
}
int compare(char * _pass, char * _ackn) { // если эквиваленты, возвращает длины, нет - ноль
    int result = 0, p, a;
    if (_pass && _ackn) {
        p = 0, a = 0;
        while (_pass[p++] != 0);
        while (_ackn[a++] != 0);
        if (p == a) {
            result = p - 1;
            p = 0, a = 0;
            while (_pass[p] == _ackn[a] && _ackn[a]) { p++; a++; };
            if (p < result) result = 0;
        }
    }
    return result;
}
void ui(short _msg) {
    setlocale(LC_CTYPE, "Russian_Russia.1251");
    switch (_msg) {
        case PASSWORD: printf(" Введите пароль: "); break;
        case ACKKNOWLEDGEMENT: printf(" Подтвердите пароль: "); break;
        case ERROR: printf("a Вы ошиблись! Повторите ввод: "); break;
        case GOOD: printf(" Успешно! "); break;
    }
    setlocale(LC_CTYPE, "English_United States.866");
}

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: Динамическое выделение памяти, при сравнении строк. (Си без использования встр. функций)

Как динамически выделить память под структуру? (Си)
Так динамически или статически ?

статически :
Book mybookarray[3];
подробнее...
спросили в Stdio h Stdlib h
Динамический массив в Си
Операция new для языка C++, а в Си требуется такая конструкция при выделении памяти:подробнее...

Си realloc
А чем тебе описания в сети не по-человечески? Судя по коду, тебе еще рано за управление памятью
подробнее...
спросили в Static X
Оператор return в СИ
Оператор return возвращает то, что ты укажешь ему.
Оперируют в большинстве только со
подробнее...
Динамическое распределение памяти на Википедии
Посмотрите статью на википедии про Динамическое распределение памяти
Модель памяти в языке Си на Википедии
Посмотрите статью на википедии про Модель памяти в языке Си
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*