sizeof по аргументу - PullRequest
       11

sizeof по аргументу

0 голосов
/ 19 сентября 2011

Даже с int foo(char str[]);, который будет принимать массив, инициализированный строковым литералом sizeof, не работает.Меня попросили сделать что-то наподобие strlen, и я хочу использовать метод sizeof для всей строки, а затем вычесть соответственно в зависимости от определенного необычного токена.Пропускает некоторые операции, а не просто считает все.

Так что да, я попытался использовать оператор разыменования в массиве (и указатель тоже пробовал), но в итоге я получил только первый элемент массива.

Как я могу изменить размер переданных аргументов.Я полагаю, что передача по значению может сработать, но я не знаю, возможно ли это вообще для строк.

Ответы [ 4 ]

2 голосов
/ 19 сентября 2011

int foo(char str[]); примет массив, инициализированный строковым литералом

Это не то, что он делает.char str[] здесь идентично char* str.Когда тип массива используется в качестве типа параметра, он преобразуется в соответствующий ему тип указателя.

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

1 голос
/ 19 сентября 2011

Вы не можете использовать sizeof здесь. В массивах C распадаются на указатели при передаче в функции, поэтому sizeof дает вам 4 или 8 - размер указателя в зависимости от платформы. Используйте strlen(3) как предложено или передайте размер массива в качестве явного второго аргумента.

0 голосов
/ 19 сентября 2011

Вы не можете передать массив в качестве параметра функции, поэтому вы не можете использовать трюк sizeof внутри функции. Выражения массива неявно преобразуются в значения указателя в большинстве контекстов, включая вызовы функций. В контексте объявления параметров функции T a[] и T a[N] являются синонимами T *.

Вам нужно будет передать размер массива в качестве отдельного параметра.

0 голосов
/ 19 сентября 2011
Строки

C - это просто массивы char.Массивы не передаются по значению в C;вместо этого передается указатель на их первый элемент.

Таким образом, эти два одинаковы:

void foo(char blah[]) { ... }
void foo(char *blah)  { ... }

, и эти два одинаковы:

char str[] = "Hello";
foo(str);

char *p = str;
foo(p);
...