Почему после выделения памяти и lstrcatA() вылетает программа

Я использую код

#include <windows.h>
#include <iostream>

void create(char* ptr, int size)
{
    ptr = (char*)malloc(sizeof(char) * size);
    memset(ptr, 0, sizeof(char) * size);
}

int main()
{
    char* ptr = nullptr;
    create(ptr, 2000);
    char str[] = "TEXT_TEXT_TEXT_123";
    lstrcatA(ptr, str);
}

И у меня вылетает программа введите сюда описание изображения

Но при выделении памяти не через функцию всё в порядке

#include <windows.h>
#include <iostream>

void create(char* ptr, int size)
{
    ptr = (char*)malloc(sizeof(char) * size);
    memset(ptr, 0, sizeof(char) * size);
}

int main()
{
    char* ptr = nullptr;
    ptr = (char*)malloc(sizeof(char) * 2000);
    memset(ptr, 0, sizeof(char) * 2000);
    char str[] = "TEXT_TEXT_TEXT_123";
    lstrcatA(ptr, str);
}

то есть когда выделаю память не через функцию то всё в порядке. Скажите пожалуйста в чем тут разница если я выделаю память через функцию по одинаковой схеме.


Ответы (1 шт):

Автор решения: Anton Shchyrov

Потому, что вы внутри функции инициализируете указатель, но не возвращаете его в управляющую программу.

Варианты решения:

  1. Вернуть его как результат функции

    char * create(int size)
    {
        char * ptr = (char*)malloc(sizeof(char) * size);
        memset(ptr, 0, sizeof(char) * size);
        return ptr;
    }
    
    char* ptr = create(2000);
    
  2. Передать в функцию двойной указатель

    void create(char ** ptr, int size)
    {
        *ptr = (char*)malloc(sizeof(char) * size);
        memset(*ptr, 0, sizeof(char) * size);
    }
    
    char* ptr = nullptr;
    create(&ptr, 2000);
    
  3. Передать в функцию ссылку на указатель

    void create(char * &ptr, int size)
    {
        ptr = (char*)malloc(sizeof(char) * size);
        memset(ptr, 0, sizeof(char) * size);
    }
    
    char* ptr = nullptr;
    create(ptr, 2000);
    
→ Ссылка