malloc возвращает указатель на первый выделенный байт.Внутренне он отслеживает, сколько памяти было выделено, поэтому он знает, сколько освободить (вам нужно вставить вызовы free (), или, кстати, вы потеряете память).Обычно он делает это, выделяя немного памяти перед указателем, который он вам дает, и сохраняя там длину, однако это не требуется.
Памятьвыделенный malloc никак не связан с main.В настоящее время main является единственной функцией, локальные переменные которой имеют указатель на эту память, но вы можете передать указатель на другую функцию, и эта функция также сможет получить доступ к памяти.Кроме того, при возврате функции, вызвавшей malloc, эта память останется выделенной, если не будет освобождена вручную.
Имя переменной не имеет значения.Указатель - это (в первом приближении) просто число.Подобно тому, как запуск int a = 42; a = 20;
разрешен и заменяет предыдущее значение a новым, int *p = malloc(n); p = malloc(n);
сначала назначит указатель, возвращенный первым вызовом malloc p, а затем заменит его возвращаемым значением второго вызова,Вы также можете иметь несколько указателей, указывающих на один и тот же адрес:
int *a = malloc(42);
int *b = malloc(42);
int *c = a;
a = malloc(42);
В конце этого кода для c будет установлено значение, возвращаемое первым вызовом malloc, а для a будет возвращено значениепоследним вызовом malloc.Как если бы вы сделали:
//assume here that f() returns a different value each time
//it's called, like malloc does
int a = f();
int b = f();
int c = a;
a = f();
Что касается второй части вашего вопроса:
for(int i=0;i<n;i++){
int array[50];
}
Приведенный выше код создаст массив с достаточным пространством для 50 дюймов внутритекущий кадр стека.Он будет локальным для блока внутри цикла for и не будет сохраняться между итерациями, поэтому он не создаст n отдельных копий массива.Так как массивы, объявленные таким образом , являются частью локального фрейма стека, вам не нужно их вручную освобождать;они прекратят свое существование при выходе из этого блока.Но вы можете передать указатель на этот массив другой функции, и он будет действителен до тех пор, пока вы не вышли из блока.Поэтому следующий код ...
int sum(int *arr, size_t n) {
int count = 0;
for (size_t i = 0; i < n; i++) {
count += arr[i];
}
return count;
}
for(int i=0;i<n;i++){
int array[50];
printf("%d\n", sum(array, 50));
}
... будет допустимым (во всяком случае, с точки зрения управления памятью; вы никогда не инициализируете массив, поэтому результат вызова суммы не определен).
В качестве второстепенного примечания, sizeof(char)
определяется как 1. Вы можете просто сказать malloc(6)
в этом случае.sizeof
необходимо при выделении массива большего типа.