Выделите и назначьте на память эффективно - PullRequest
0 голосов
/ 15 февраля 2019

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

float *newMeasurements1;
newMeasurements1 = malloc(sizeof(calcNewArray(oldArray)));
newMeasurements1 = calcNewArray(oldArray);


float *calcNewArray(float *oldArray) {
    float *newArray;

    int new_size = sizeof(oldArray) - outliers;
    newArray = malloc((new_size) * sizeof(float));

    for (i = 0; i < new_size; i++) {
        newArray[i] = oldArray[i];
    }

    return newArray;
}

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

1 Ответ

0 голосов
/ 15 февраля 2019

Эта строка бесполезна:

newMeasurements1 = malloc(sizeof(calcNewArray(oldArray)));

просто напишите это:

newMeasurements1 = calcNewArray(oldArray);

Malloc уже сделан в calcNewArray.

Но есть еще одинпроблема в calcNewArray - массивы распадаются на указатели на их первый элемент при передаче их функции, поэтому sizeof(oldArray) - это не размер массива, который вы передали calcNewArray, а размер указателя.Вам необходимо явно указать размер oldArray в качестве второго параметра:

float *calcNewArray(float *oldArray, int oldsize) {
    float *newArray;

    int new_size = oldsize - outliers;
    newArray = malloc((new_size) * sizeof(float));

    for (i = 0; i < new_size; i++) {
        newArray[i] = oldArray[i];
    }

    return newArray;
}
...