Значение используется без инициализации - PullRequest
0 голосов
/ 18 января 2019

в моем коде я использую malloc для создания строки n для моего проекта и после этого я создал 'tr', чтобы поместить всю строку из ** ул с маленькими буквами. и это дает мне ошибку:

Ошибка проверки времени выполнения # 3 - переменная 'str' используется без инициализации.

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

void main(void)
{
    int n;
    char **str;
    char *tr;
    int cnt, k;
    cnt = k = NULL;
    printf("Enter number fo strings:\n");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        str[i] = (char*)malloc(sizeof(char)*n);

    str = (char**)malloc(sizeof(char)*n + 1);

    puts("Enter The strings");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; i < n; j++)
            scanf("%s", &str[i][j]);
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; i < n; j++)
        {
            if (str[i][j] >= 'a' && str[i][j] <= 'z')
                cnt++;
        }
    }

    tr = (char*)malloc(sizeof(char)*(cnt + 1));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; i < n; j++)
        {
            if (str[i][j] >= 'a' && str[i][j] <= 'z')
                tr[k++] = str[i][j];
        }
    }

    tr[k] = NULL;
    puts(tr);
    free(tr);
    free(str);
}

Ответы [ 3 ]

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

Вы не выделяете перед использованием, вы используете , а затем выделяете, но также выделяете неправильно. Правильное распределение:

str = malloc(sizeof(char*) * n);

Где str это массив char*, , а не массив char.

Хорошо, что вы слушаете предупреждения своего компилятора, но это было действительно конкретным, и вы должны быть в состоянии найти проблему. Порядок распределения очень важен, и «достаточно близко» не приемлемо. Это или работает, или это неопределенное поведение.

0 голосов
/ 18 января 2019
char **str;
char *tr;
int cnt, k;
cnt = k = NULL;
printf("Enter number fo strings:\n");
scanf("%d", &n);
for (int i = 0; i < n; i++)
    str[i] = (char*)malloc(sizeof(char)*n);  // here

вы используете str, который не инициализирован.Что вы ожидаете?str имеет неопределенное значение, поскольку оно неинициализировано и почти наверняка содержит недопустимое значение указателя.Разыменование недействительного указателя (что делает оператор []) - это неопределенное поведение.

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

Кстати.

puts("Enter The strings");
for (int i = 0; i < n; i++)
{
    for (int j = 0; i < n; j++)
        scanf("%s", &str[i][j]);
}

Также неверно.Внутреннему циклу не нужно читать входные данные из стандартного ввода и сохранять их в str[i].Кроме того, не используйте %s без указания символа для ограничения количества символов, записываемых в место назначения.

if (str[i][j] >= 'a' && str[i][j] <= 'z')

Вот для чего islower() из <ctype>.

free(str);

Этого недостаточно для освобождения памяти, поскольку str указывает на количество указателей на char, которые также указывают на выделенную память.

for (size_t i = 0; i < n; ++i)
    free(str[i]);
free(str);

на помощь.

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

У вас есть два раздела кода в неправильном порядке:

for (int i = 0; i < n; i++)
    str[i] = (char*)malloc(sizeof(char)*n);

str = (char**)malloc(sizeof(char)*n + 1);

Вам необходимо выделить память для str, прежде чем вы сможете назначить str[i]. И это должно быть sizeof(char *) * n; нет необходимости добавлять 1 к этому (вам нужно это только в tr, так как вы добавляете нулевой терминатор в конце).

Должно быть:

str = malloc(sizeof(char*)*n);
for (int i = 0; i < n; i++) {
    str[i] = malloc(sizeof(char)*n);
}

После

Также, пожалуйста, прочитайте Я разыскиваю результат malloc? и Почему считается плохой практикой опускать фигурные скобки?

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