Если у вас есть указатель , тогда ТОЛЬКО способ знать размер - хранить размер отдельно или иметь уникальное значение, которое завершает строку. (обычно '\0'
) Если у вас нет ни одного из них, это просто невозможно.
EDIT: поскольку вы указали, что вы выделили буфер, используя malloc
, тогда ответ будет приведен выше. Вам нужно либо запомнить, сколько вы выделили malloc
, либо просто иметь конечное значение.
Если вам случится иметь массив (например: char s[] = "hello\0world";
), то вы можете прибегнуть к sizeof(s)
. Но будьте очень осторожны, как только вы попытаетесь с помощью указателя, вы получите размер указателя, а не размер массива. (но strlen(s)
будет равен 5
т.к. оно доходит до первого '\0'
).
Кроме того, массивы распад указателям при передаче функций. Поэтому, если вы передадите массив функции, вы вернетесь к квадрату.
Примечание:
void f(int *p) {}
и
void f(int p[]) {}
и
void f(int p[10]) {}
все то же. Во всех трех версиях p
является указателем , а не массивом.
Во-первых, указатели на символы не содержат NUL-байтов, они указывают на память, содержащую NUL-байты. Во-вторых, как вы * определяете * длину строки, содержащей NUL байты? То есть, как вы узнали бы, что достигли конца? –