Подставляя для malloc - PullRequest
       9

Подставляя для malloc

0 голосов
/ 27 сентября 2019

С учетом следующей функции to_lower:

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

void to_lower(char ** strings) {
    char * original_string, lower_string;
    for (int i=0; (original_string=strings[i]) != NULL; i++) {
        lower_string = malloc(strlen(original_string)+1);
        for (int j=0; j<=strlen(original_string); j++) 
            lower_string[j] = tolower(original_string[j]);
        strings[i]=lower_string;
    }
}


int main(void) {
    char * strings[] = {"Hello", "Zerotom", "new", NULL };
    to_lower(strings);
}

Возможно ли выполнить ту же функцию без вызова malloc?Если так, как это будет сделано?Я пытаюсь выяснить, могу ли я изменить «значение» указателя на месте без необходимости выделять для него новую память.

1 Ответ

0 голосов
/ 28 сентября 2019

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

Поэтому я предлагаю настроить структуру данных фиксированного размера во время запуска, затем установить и изменить содержимое и, наконец, снова все очистить - как это:

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

#define LEN 10
#define NUM 3

char **init (int num, int len) {
    char **strings = calloc(num, sizeof(char*));
    for (int i=0; i < num; i++) {
        strings[i] = calloc(len, sizeof(char));
    }
    return strings;
}

void teardown (char **strings, int num) {
    for (int i=0; i < num; i++) {
        free(strings[i]);
    }
    free(strings);
}

void to_lower(char **strings, int num, int len) {
    for (int i=0; i < num; i++) {
        for (int j=0; j < len; j++) 
            strings[i][j] = tolower(strings[i][j]);
    }
}

int main(void) {
    // startup
    char **strings = init(NUM, LEN);

    // do things
    sprintf(strings[0], "%s", "Hello");
    sprintf(strings[1], "%s", "Zerotom");
    sprintf(strings[2], "%s", "new");
    to_lower(strings, NUM, LEN);

    // shutdown
    teardown(strings, NUM);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...