Как правильно определить буфер, передать функцию для динамической загрузки c? - PullRequest
0 голосов
/ 04 февраля 2020

пожалуйста, посмотрите на мой код ниже. Мне было интересно, если это правильный способ передать буфер функции, заполнить его и вернуть его в качестве возврата. Возможно, есть некоторые приемы, которые я пропустил, так как некоторые программисты заполняют буфер нулями, прежде чем добавлять в него данные. Кроме того, пожалуйста, дайте мне знать, если у меня есть небольшие ошибки или проблемы. Большое спасибо!

#define BUFFER_SIZE 256

void get_data(char *ptr, size_t len)
{
    char* temp = (char*)malloc(len * 1);
    char sample_data[] = "data";
    strcpy(temp, sample_data, sizeof(sample_data));
    memcpy_s(ptr, len, temp, len);
    free(temp);
}

int main(void) 
{
    int status = EXIT_SUCCESS;

    char* data = (char*)malloc(BUFFER_SIZE * 1);

    status = get_data(data, BUFFER_SIZE);

    if(status != 0)
        return EXIT_FAILURE;        

    free(data);

    return EXIT_SUCCESS;
}

1 Ответ

2 голосов
/ 04 февраля 2020

Кажется, что проблем довольно много.

Я думаю, get_data и fill_data должны быть одной и той же функцией? (Но тогда почему один теряет силу, в то время как другой возвращает статус?)

Прежде всего, malloc() может потерпеть неудачу и вернуть NULL. Всегда проверяйте возвращаемое значение malloc() и убедитесь, что распределение не завершилось неудачей.

Во-вторых, в get_data() вы выделяете некоторую память с помощью char* temp = (char*)malloc(len * 1); и используете char *temp, чтобы указать на нее. Но затем вы фактически отбрасываете эту память и вместо этого temp указывает на строку "fill_data_with_something". В этом конкретном случае распределение памяти в get_data() было совершенно ненужным. И память, которая была mallo c 'd, безвозвратно теряется и становится утечкой памяти!

В-третьих, вы копируете 256 байтов из буфера, который содержит только "fill_data_with_something", который определенно меньше, чем 256. Таким образом, вы читаем за пределами буфера. Вы должны только скопировать strlen(temp) байт.

Хуже всего то, что вы затем пытаетесь free() указатель, который не приходит от malloc(). Это вызывает неопределенное поведение.

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