Как извлечь размер указателя в C - PullRequest
1 голос
/ 27 марта 2020

У меня есть такой код:

int main()
{
    double *u;
    int len;
    u=(double *)malloc(sizeof(double)*10);
    len = sizeof(u);
    printf("Length Of Array = %d\n", len);
    return 0;
}

, но длина 4 Не 10. Как я могу извлечь 10 из указателя u ?! пожалуйста, помогите мне спасибо

Ответы [ 3 ]

5 голосов
/ 27 марта 2020

Это твоя работа. C не предоставляет переносимый способ узнать, с учетом указателя, сколько памяти было выделено.

sizeof даст вам sizeof(double*), и все. Это 4 в вашей системе.

2 голосов
/ 27 марта 2020

Это невозможно. sizeof дает размер объекта. В вашем случае объект u, который является указателем. Ваша система имеет 32 бита, а указатели - 4 байта.

если вы используете sizeof (* u) - вы получите размер ссылочного типа. В данном случае это double. В большинстве систем он будет иметь длину 8 байт.

с использованием sizeof для определения размера строки - один из самых частых вопросов, задаваемых здесь.

1 голос
/ 27 марта 2020

Указатель не содержит информацию о размере области памяти. Вы должны следить за размером самостоятельно. Например, вы можете создать собственный тип (например, struct), который одновременно содержит и указатель, и размер выделения.

Вот простая реализация, с которой можно начать:

typedef struct {
  double* ptr;
  size_t len;
} double_arr_t;

// prototype
double_arr_t alloc_double_arr(size_t len);

int main(void) {
  // alloc the new array of 10 `double` elements
  double_arr_t arr = alloc_double_arr(10);
  printf("Length of 'arr' is %zu\n", arr.len); // Length of 'arr' is 10

  // assign a value to the first element
  arr.ptr[0] = 3.14;
  // get the value of the first element
  double first_element = arr.ptr[0];

  // free the array when you're done using it
  free(arr.ptr);
}

double_arr_t alloc_double_arr(size_t len) {
  double_arr_t res;
  res.ptr = malloc(len * sizeof(double));
  res.len = len;
  return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...