char * buf = malloc (sizeof (char *) * 16) против char buf [sizeof (char *) * 16] - PullRequest
0 голосов
/ 01 марта 2012

Я читаю код C, который делает

char * buf = malloc(sizeof (char *) * 16)

вместо

char buf[sizeof (char *) * 16]

в чем разница?ну, я думаю, первое выражение не нужно, если realloc() не вызывается, или я ошибаюсь, думая?

Ответы [ 4 ]

5 голосов
/ 01 марта 2012

char buf[sizeof(char*)*16] - это массив, выделенный автоматически, который обычно является стеком. Он действителен, пока buf находится в области видимости и достаточно стека.

malloc выделяет память из некоторой кучи. Он действителен до тех пор, пока эта память не будет free() ed. Как правило, доступно гораздо больше кучи.

1 голос
/ 01 марта 2012

Динамический массив

Первый, это динамический массив . Выражение char * buf = malloc(sizeof (char *) * 16) хранит элементы в памяти (malloc в основном используется для выделения памяти). Преимущества его использования в том, что вы можете перераспределить его, то есть изменить его размер во время выполнения. Однако вам, возможно, придется выделять новую память каждый раз, когда вы добавляете новый элемент. Вот пример:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main() {
  int* array;
  int n, i;
  printf("Enter the number of elements: ");
  scanf("%d", &n);
  array = malloc(n*sizeof(int));
  for (i=0; i<n; i++) {
  printf("Enter number %d: ", i);
  scanf("%d", &array[i]);
  }
  printf("\nThe Dynamic Array is: \n");
  for (i=0; i<n; i++) {
  printf("The value of %d is %d\n", i, array[i]);
  }
  printf("Size= %d\n", i);
  getch();
  return 0;
}

Выход:

Output

Автоматический (статический?) Массив

Второе выражение char buf[sizeof (char *) * 16] просто объявляет скучный автоматический массив. Это размер статичен. Без динамического изменения размера, перераспределения и т. Д.

примечание: извинения за тип, брошенный до malloc. приведение возвращаемого значения malloc приведет к тому, что компилятор не выдаст ошибку , если вы сделаете что-то не так. Это может сопровождаться неопределенными ошибками во время выполнения и отладкой ада. Всегда избегайте типизации результата malloc. Спасибо @Lundin.

1 голос
/ 01 марта 2012

Примечание Янна верно.

Похоже, что это массив указателей. Так как он выделяет память в 16 раз больше размера указателя на символ. Размер указателя может варьироваться в разных системах. Некоторые указатели являются 32-разрядными (4 байта), а другие - 64-разрядными (8 байтов).

char buf [sizeof (char *) * 16] - это не массив указателей, это массив символов, который имеет элементы, равные размеру указателя на символ умножить на 16.

0 голосов
/ 27 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...