Я пытаюсь динамически выделить массив, поместить в него некоторые данные, а затем освободить его и установить нулевой указатель массива, чтобы он не был доступен в будущем. Кроме того, это не связано, но я сохраняю размер массива в первом элементе, а затем передаю его обратно в индексированном виде, это часть назначения, так что, надеюсь, это никого не смущает.
Если я правильно понимаю ошибку, я пытаюсь вызвать free()
для массива, в который скопирован мой массив mallo c 'ed. Это недопустимо, потому что free()
вызывается не для фактического массива mallo c 'ed, а для того, в котором хранятся его значения.
Если это так, как я могу исправить свой вызов free()
только для получения адреса массива и разыменования его как free(*array);
. Прямо сейчас у меня есть куча звездочек и актеров, и я понятия не имею, почему это работает. Если вы знаете, как исправить звонок в вышеперечисленном или просто объясните, почему то, что у меня сейчас работает, я был бы очень признателен. Моя цель состоит в том, чтобы иметь возможность установить для параметра произвольной свободной функции параметр указатель void вместо указанного c указателя типа данных. Спасибо !!
#include <stdlib.h>
int getSizeArray(void *array);
void * createArray(int n, int sizeOfDatatype);
void freeArray(double ** array);
int main(void){
double * arr = createArray(10, sizeof(double));
int size = getSizeArray(arr);
/* using output for error checking
for(int i = 0; i < 10; i++){
arr[i] = i;
}
for(int j = 0; j < 10; j++){
printf("%f\n", arr[j]);
}
*/
void* p = &arr;
freeArray(p);
}
int getSizeArray(void *array){
int s = ((int *) array)[-1];
return s;
}
void * createArray(int n, int sizeOfDatatype){
int * array = malloc((n * sizeOfDatatype) + sizeof(int));
array[0] = n;
return (void*) (array + 1);
}
void freeArray(double ** array){
free(*array);
*array = NULL;
}
РЕДАКТИРОВАТЬ: Посмотрите на комментарий @JonathanLeffler. Вопрос с выравниванием. Я переключил часть своего кода, но мне пришлось индексировать его обратно и не приводить в моих функциях, а вместо этого в main
#include <stdlib.h>
int getSizeArray(void *array);
void * createArray(int n, int sizeOfDatatype);
void freeArray(double ** array);
int main(void){
double * arr = createArray(10, sizeof(double));
arr = (void*) (arr + 1);
int size = getSizeArray(arr);
/* using output for error checking*/
for(int i = 0; i < 10; i++){
arr[i] = i;
}
for(int j = 0; j < 10; j++){
printf("%f\n", arr[j]);
}
arr = (double*) (arr - 1);
freeArray(&arr);
for(int j = 0; j < 10; j++){
printf("%f\n", arr[j]);
}
}
int getSizeArray(void *array){
int s = ((int *) array)[-1];
return s;
}
void * createArray(int n, int sizeOfDatatype){
int * array = malloc((n * sizeOfDatatype) + sizeof(int));
array[0] = n;
return array;
}
void freeArray(double ** array){
free(*array);
*array = NULL;
}