有什么方法可以使用 C 中带有指针的 sizeof 函数来获取字符串的正确大小

Is there any way to get the correct size of a string using sizeof function with pointers in C

int main() {
    char *s = "hello world!";
    printf("%d\n",sizeof(s));
}

我知道它会 return 指针的大小。但我想知道有没有什么方法可以使用带指针的 sizeof 函数来获取字符串的长度。 我不希望你将 (char s[] ) s 用作数组,将其用作指针 请尽可能尽快回复。我也不想使用 strlen().

指针不保留指向单个对象或数组第一个元素的信息。

考虑以下示例

char *p;
char c = 'A';

p = "Hello";
p = &c;

正如所见,同一个指针可以指向具有类型 char[6] 的字符串文字 "Hello"(它的第一个字符)和单个字符 c.

通常,当将字符数组传递给函数时,它会隐式转换为指向其第一个元素的指针。但是,如果您将传递一个指向整个数组的指针,那么您可以使用 sizeof 运算符来确定它的大小。

例如

#include <stdio.h>

void f( char (*p)[6] )
{
    printf( "%zu\n", sizeof( *p ) );
}

int main( void )
{
    f( &"Hello" );
}

但这种方法有一个缺点,即在函数参数的声明中,您必须通过引用预先指定接受数组的大小。

因此,如果需要知道函数内数组的大小,一般方法是声明带有附加参数的函数,该参数指定传递的数组的大小。

考虑到一个字符串可以包含在一个字符数组中,该数组的大小远大于存储该字符串所需的大小。因此,要确定字符串本身的大小,您应该使用标准字符串函数 strlen.

只有一种方法:

#include <stdio.h>
int main() 
{
    char s[] = "hello world!";
    printf("%s -> %zu\n", s, sizeof s - 1);
}

你需要将s 声明为数组,而不是指针,sizeof运算符,应用于指针,给你大小一个指针变量,它不是数组的大小(也不是你想要的)。 如您所见,我在声明中初始化数组,所以我不需要将大小放在括号之间(这不适用于赋值语句,它必须是带有初始化程序的声明)然后我减去一个到数组的大小,因为 sizeof 运算符给我数组的大小(不是字符串长度),这包括末尾 [=15=] 字符的 space。

当你运行它时:

$ a.out
hello world! -> 12
$ _