Я пытаюсь вызвать функцию, написанную на 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?
Проблема возникает из-за того, что вы меняете локальные переменные 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;
}
}
Краткий ответ: malloc
вызов функции malloc
внутри функции.
Чуть более длинный ответ:
Вы меняете значение указателя vals
на другую вновь выделенную память - таким образом, аргумент, который вы передаете, становится неиспользуемым (и, следовательно, никогда не заполняется).
Результат всегда 0 - совпадение, это может быть что угодно (или вы могли бы получить носовые демоны), потому что вы читаете неинициализированную память, что является неопределенным поведением.
Это из-за этого, если вы удалите вызов:
vals = new double[10];
vals = malloc(10 * sizeof(double));
Первое значение перезаписывается.
void populateArray(double* vars);
{
vars = (double*) malloc(10*sizeof(double)); // <---- remove this line completely
Проблема в том, что вы игнорируете vars
вам vars
и создаете для него совершенно новый буфер.
Хуже того, этот буферный указатель теряется при возврате этой функции, что приводит к утечке памяти.
Просто используйте vars
вам дали - удалите указанную выше строку.
new
при звонке. Нет необходимости выделять память для копии функции (не говоря уже о том, чтобы не освобождать ее) или приводить результатmalloc
при этом.new
я получаю ошибку сегментации?