Строка меняется, когда я Malloc другой строки в C - PullRequest
0 голосов
/ 28 января 2019

Я сейчас работаю над созданием оболочки.Я хочу разделить простую строку в 2D массив.Сначала это работало отлично, но теперь у меня странная проблема: моя простая строка "str" ​​меняется после того, как я что-то обнаружил.Например, если я создам новый массив, например

char *tmp = malloc(sizeof(char) * 15));

, то мой str, который был "ls -l", станет чем-то вроде " OO" или " A".

IЯ уже пытался изменить размер malloc, но это не решило проблему, хотя и изменило str по-другому.Это мой код:

char **mem_alloc_2d_array(int nb_rows, int nb_cols) {
    char **map = malloc(nb_rows * sizeof(*map + 1));

    for (int i = 0; i < nb_rows; i++) {
        map[i] = malloc(nb_cols * sizeof(**map + 1));
    }
    return map;
}

int what_is_x(char const *str) {
    int x = 2;

    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == ' ')
            x++;
    }
    return x;
}

char **try_this(char const *str) {
    int size = my_strlen(str);
    int x = what_is_x(str);
    char **words = mem_alloc_2d_array(x, size);

    return words;
}

char **my_str_to_wordtab(char *str) {
    int j = 0;
    int i = 0;
    char **words = try_this(str);

    if (str[0] == '\n' || str[0] == '\r')
        words[0] = NULL;
    for (; str[i] == ' ' || str[i] == '\t'; i++);
    for (int x = 0; str[i] != '\n'; i++, x++) {
        if (str[i] == ' ' || str[i] == '\t') {
            words[j][x] = '\0';
            j++;
            x = 0;
            while (str[i] == ' ' || str[i] == '\t')
                i++;
        }
        words[j][x] = str[i];
    }
    j++;
    words[j] = (char *)0;
    return words;
}

Я ожидаю, что в функции try_this(), если мой str будет таким большим, как "ls -l Makefile", то оба вызова my_putstr(str) будут печатать одно и то же,но они не делают.

1 Ответ

0 голосов
/ 28 января 2019

Неясно, о чем вы говорите в связи с вызовами функции my_putstr(str), поскольку ни эта функция, ни какие-либо вызовы к ней не появляются в представленном вами коде.Тем не менее, я могу с уверенностью сказать, что ваш код для выделения памяти ошибочен и, по крайней мере, частично неверен.Учтите это:

    char **map = malloc(nb_rows * sizeof(*map + 1));

.Какой именно смысл у + 1 там?Обратите внимание, что *map имеет тип char *, и, следовательно, *map + 1.Оператор sizeof вычисляет результат на основе типа его операнда, поэтому ваше выражение sizeof вычисляет то же значение, что и sizeof(*map).Я предполагаю, что вы, вероятно, хотите

    char **map = malloc((nb_rows + 1) * sizeof(*map));

, который резервирует место для nb_rows + 1 указателей.

Аналогично, это ...

    map[i] = malloc(nb_cols * sizeof(**map + 1));

...не делает то, что вы, вероятно, намереваетесь.Чтобы зарезервировать место для разделителя для каждой строки, это было бы лучше записать как

    map[i] = malloc((nb_cols + 1) * sizeof(**map));

.Но так как этот код относится только к строкам, а размер char равен 1 по определению , я бы сам написал это так:

    map[i] = malloc(nb_cols + 1);

У вас нетзарезервировало достаточно места для ваших данных, поэтому неудивительно, что вы видите повреждение памяти.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...