C ++ передача ссылки на массив в функцию C

0

Я пытаюсь вызвать функцию, написанную на C, которая передает указатель на массив.

В C++ у меня есть следующее:

double* x = new double[10];

populateArray(x);

В C:

void populateArray(double* vars); 
{
    vars = (double*) malloc(10*sizeof(double));

    int i;

    for(i = 0; (i < 10); i++)
    {
        vars[i] = 1*20;
    }
}

Однако, когда я пытаюсь вывести содержимое x внутри кода C++, результат всегда равен 0?

  • 0
    Не нужно использовать new при звонке. Нет необходимости выделять память для копии функции (не говоря уже о том, чтобы не освобождать ее) или приводить результат malloc при этом.
  • 0
    @chris Когда я не использую new я получаю ошибку сегментации?
Показать ещё 2 комментария
Теги:
arrays
pointers

3 ответа

4
Лучший ответ

Проблема возникает из-за того, что вы меняете локальные переменные vars.

Изменить на:

double* x; //you don't need to allocate here if you are allocating later

populateArray(&x);

А также:

void populateArray(double** vars) 
{
    *vars = malloc(10*sizeof(double)); //also no need to cast malloc

    int i;

    for(i = 0; (i < 10); i++)
    {
        (*vars)[i] = 1*20;
    }
}
  • 0
    Обратите внимание, что распределение памяти здесь выполняется иначе, чем в других ответах. Функция в этом ответе берет адрес указателя, который ничего не указывает, и указывает на новый инициализированный массив. Функции в моих и других ответах принимают указатель, который уже указывает на массив, и инициализируют значения в этом пространстве. В любом случае, ваша проблема решится, но хорошо бы различать их.
0

Краткий ответ: malloc вызов функции malloc внутри функции.

Чуть более длинный ответ:

Вы меняете значение указателя vals на другую вновь выделенную память - таким образом, аргумент, который вы передаете, становится неиспользуемым (и, следовательно, никогда не заполняется).

Результат всегда 0 - совпадение, это может быть что угодно (или вы могли бы получить носовые демоны), потому что вы читаете неинициализированную память, что является неопределенным поведением.

Это из-за этого, если вы удалите вызов:

vals = new double[10];
vals = malloc(10 * sizeof(double));

Первое значение перезаписывается.

0
void populateArray(double* vars); 
{
    vars = (double*) malloc(10*sizeof(double)); // <---- remove this line completely

Проблема в том, что вы игнорируете vars вам vars и создаете для него совершенно новый буфер.

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

Просто используйте vars вам дали - удалите указанную выше строку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню