получение строки с динамическим управлением памятью - PullRequest
0 голосов
/ 27 декабря 2010

Я хочу получить строку вроде 34,34; 34,21; 45,12; 45,12 (длина не определена). Я хочу динамическое распределение памяти с помощью realloc, но я не могу этого сделать.Как я могу получить, как эти символы в строку ??

это будет строка = {34,34,34,21,45,12,45,12}

Ответы [ 3 ]

3 голосов
/ 27 декабря 2010

Вы должны знать длину заранее, и когда вы знаете, что ваш буфер слишком мал для данных, которые будут вводиться заново, используйте:

realloc(ptr, newLength);
0 голосов
/ 27 декабря 2010

Возможно, вы передаете указатель в качестве аргумента функции b (), которая, в свою очередь, вызывает функцию realloc. В этом случае вам также необходимо вернуть указатель.

0 голосов
/ 27 декабря 2010

Если вы хотите сделать это во время компиляции (это единственный способ выполнить инициализаторы, аналогичные тем, что есть в вашем вопросе), вы можете позволить инициализатору определить размер для вашего массива:

char string[] = {34,34,34,21,45,12,45,12, 0}; // added a 0 to the end to 
                                              //    make it '\0' terminated
                                              //    You might not need that

Если вы хотите, чтобы ваша строка брала данные из источника времени выполнения (из файла или другого ввода), вам нужно будет выполнить выделение самостоятельно, и как именно это сделать, зависит от того, как вы собираетесь бытьполучать данные.

В следующем примере данные из stdin считываются в динамически размещаемый символьный массив, увеличивая массив по мере необходимости до достижения EOF.Он увеличивает массив на 20 байт каждый раз, так что вы можете легко проверить, что происходит в отладчике, но реальной программе лучше бы увеличить на что-то большее, например, удвоив размер или просто увеличивая с шагом 100 КБ - подробности вашегоОжидаемые данные должны помочь вам принять это решение).

#include <stdlib.h>
#include <stdio.h>


void fatal_error(void);

int main( int argc, char** argv)
{
    int buf_size = 0;
    int buf_used = 0;

    char* buf = NULL;
    char* tmp = NULL;    

    char c;
    int i = 0;

    while ((c = getchar()) != EOF) {
        if (buf_used == buf_size) {
             //need more space in the array

             buf_size += 20;
             tmp = realloc(buf, buf_size); // get a new larger array
             if (!tmp) fatal_error();

             buf = tmp;
        }

        buf[buf_used] = c; // pointer can be indexed like an array
        ++buf_used;
    }

    puts("\n\n*** Dump of stdin ***\n");

    for (i = 0; i < buf_used; ++i) {
        putchar(buf[i]);
    }

    free(buf);

    return 0;
}

void fatal_error(void)
{
    fputs("fatal error - out of memory\n", stderr);
    exit(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...