Как рассчитать размер статически размещенной строки в вызывающей функции в C? - PullRequest
1 голос
/ 10 марта 2020

Как получить значение 200 в функции check_size?

#include <stdio.h>
#include <string.h>
int check_size(char *ptr)
{
    //if (sizeof(ptr) == 200)
    //{
    //   ...
    //}
    printf("%ld \n", sizeof(ptr));
    printf("%ld \n", sizeof(*ptr));
    printf("%ld \n", strlen(ptr));

    return 1;
}
int main()
{
    char ptr[200]="\0";

    int s = check_size(ptr);
    return 0;
}

Ответы [ 5 ]

3 голосов
/ 10 марта 2020

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

Относительно ваших попыток:

printf("%ld \n", sizeof(ptr));

Поскольку ptr является char *, это даст вам размер этого указателя (обычно 8).

printf("%ld \n", sizeof(*ptr));

Это даст вам размер, на который указывает ptr, в частности char, который определен как 1.

printf("%ld \n", strlen(ptr));

Предполагая, что ptr указывает на строку с нулевым символом в конце, это даст вам длину строки.

Размер массива должен быть передан в качестве отдельного параметра, чтобы функция узнала его. Выражение sizeof(ptr) , если оно используется в main, даст вам размер массива в байтах.

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

Как получить значение 200 в функции check_size? Как вычислить размер статически размещенной строки в вызывающей функции в C?

Поскольку размер ptr известен во время компиляции, вы также должны жестко закодировать целочисленные литералы как меньшие насколько это возможно внутри любого исходного кода, просто используйте макрос-константу для хранения количества элементов. При этом вы можете легко рассчитать размер массива в функции check_size():

Пример программы

#include <stdio.h>
#include <string.h>

#define length 200                            // macro constant `length`.

int check_size(char *ptr)
{
    printf("%zu \n", sizeof(*ptr));           // size of `char`
    printf("%zu \n", sizeof(*ptr) * length);  // size of the array.
    printf("%zu \n", sizeof(ptr));            // size of the pointer to `char`.
    printf("%zu \n", strlen(ptr));            // length of the string.

    return 1;
}

int main()
{
    char ptr[length] = "\0";                  // macros can be used here.

    check_size(ptr);
    return 0;
}

Вывод:

1 
200 
8 
0 
0 голосов
/ 10 марта 2020

Из коробки можно передать адреса первого и последнего элементов массива, а в функции вычесть их у вас будет размер массива и доступ к нему:

#include <stdio.h>

int check_size(char *begin, char *end)
{
    printf("%ld \n", end - begin);
    return 1;
}
int main()
{
    char ptr[200]="\0";   
    int s = check_size(&ptr[0], &ptr[200]); //&ptr[200] one past the size of the array
    //if you'd like to calc the size of the array to pass you can do instead:
    int s = check_size(&ptr[0], &ptr[sizeof(ptr)/sizeof(ptr[0])]);
    return 0;
}

Живой образец здесь

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

0 голосов
/ 10 марта 2020

Как получить значение 200 в функции check_size?

Скорее, если есть функция, принимающая char*, есть функция, которая принимает указатель на массив 200 символов.

#include <stdio.h>
#include <string.h>

int check_size(char (*ptr)[200]) {
  printf("%zu \n", sizeof(ptr));
  printf("%zu \n", sizeof(*ptr));
  printf("%zu \n", strlen(*ptr));
  return 1;
}

int main() {
  char ptr[200] = "\0";
  check_size(&ptr);
  return 0;
}

Выход

8 
200 
0 

GTG

0 голосов
/ 10 марта 2020

Что следует уточнить: в вызываемой функции отсутствует понятие «размер массива». Все, что ему дано, это указатель на один байт.

Теперь, если вы хотите дать массиву конкретную инициализацию, например строку длиной в 199 символов, вы можете сделать это с помощью strlen(). Или вы можете передать размер массива, хотя это тривиально.

В целом, здесь нет способа сделать именно то, что вы хотите.

...