Попросить компилятор обрабатывать массив как массив (не указатель) при передаче его функции - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу использовать оператор sizeof после передачи массива в функцию, но язык C рассматривает его как указатель, а не массив.

Можем ли мы реализовать функциональность для решения этой задачи?

void foo(char array[])
{
    printf("sizeof array = %u\n", sizeof(array)); /* I know array is pointer here */
}

int main(void)
{
    int array[5];
    foo(array);
}

Ответы [ 3 ]

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

Невозможно, и использование нижнего индекса массива [] может сбить с толку людей, не знающих, что он будет вести себя как указатель.Подход, который я использую, состоит в том, чтобы передать длину в качестве другого аргумента или создать структуру с указателем и длиной:

struct {
    char * buffer;
    size_t length;
} buffer_t;

Мне не нравится массив в подходе struct или typedef, поскольку он ограничивает данные дофиксированный размер.

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

Вы не можете попросить компилятор об этом.Нежелательно делать то, что вы просите.

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

void foo(char array[], size_t array_size)
{
    printf("sizeof array = %zu\n", array_size);
}

int main(void)
{
    int array[5];
    foo(array, sizeof(array)) ;
}

Примечание: для печати size_t используйте% zu в printf.

Примечание: для печати количества элементов используйте: sizeof (массив) / sizeof (* массив)

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

Вы можете использовать выделенную typedef или, как сказано в примечании, структуру встраивания:

#include <stdio.h>

typedef char A5[5];

typedef struct S {
  char a[5];
} S;

void foo(A5 a) /* of course can be "void foo(char a[])" but less clear */
{
  printf("%zu %zu\n", sizeof(A5), sizeof(a));
}

void bar(S s)
{
  printf("%zu\n", sizeof(s.a));
}


int main()
{
  A5 a;
  S s;

  foo(a);
  bar(s);
}

Конечно, в случае typedef вам нужно использовать typeof на нем, а не на переменной, являющейся char*

Но все это является своего рода хаком, C - это C ...

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