C/C++中的sizeof char*数组

Aba*_*eno 8 c c++ sizeof

有很多类似的询问,但在我的情况下,我不明白什么是不起作用:

int mysize = 0;
mysize = sizeof(samplestring) / sizeof(*samplestring);
std::cout << mysize << '\n' << samplestring;
Run Code Online (Sandbox Code Playgroud)

这输出:

4

Press 'q' to quit.
Run Code Online (Sandbox Code Playgroud)

这怎么可能?4绝对不是这个字符串的大小.我甚至尝试了以下结果,结果相同:

mysize = sizeof(samplestring) / sizeof(samplestring[0]);

编辑:好的,这是声明:

char *samplestring = "Start."; 
Run Code Online (Sandbox Code Playgroud)

我在C++上,但我需要使用只接受char*的函数.稍后在代码中我将新字符串分配给该变量,例如:

samplestring = "Press 'r' for red text.";
Run Code Online (Sandbox Code Playgroud)

是的,编译器给了我警告,但我不知道如果我不能覆盖它们怎么能使用不同的字符串...

Luc*_*ore 13

4不是字符串的大小,因为samplestring它不是字符串.它是a char*,其大小(在你的平台上)4除以1(大小char)正确地为4.

在C++中,您将使用std::stringlength()方法.

在C中,您将使用strlen将参数作为NULL终止的char指针.


Mar*_*som 5

有两种方法可以使字符串常量,而您的技术仅适用于第一种。第一个创建一个字符数组,您可以在编译时获取其大小,另一个创建一个指向字符数组的指针。

char samplestring[] = "hello";
char * samplestring = "hello";
Run Code Online (Sandbox Code Playgroud)

尝试按照您的方式获取第二种情况的大小,只会得到指针的大小。在 32 位构建上,指针的大小为 4 个字符,即指针占用与 4 个字符相同的内存量。

以下内容始终会给出正确的空终止字符串的正确长度,但速度较慢。

mysize = strlen(samplestring);
Run Code Online (Sandbox Code Playgroud)

  • 注意(对于操作):如果传递给函数,第一个将衰减为指针,因此“sizeof”只会在相同的上下文中给出您期望的结果。 (2认同)

Pra*_*ian 5

首先,sizeof(samplestring[0])与相同sizeof(*samplestring),它们都返回samplestring数组第一个元素的大小。并且,假设samplestring是一个字符数组,sizeof(char)则定义为1。

您尚未显示如何samplestring声明。可能是以下之一:

char const *samplestring = "Hello, World!";
Run Code Online (Sandbox Code Playgroud)

要么

char *samplestring = malloc( ... );
Run Code Online (Sandbox Code Playgroud)

要么

char samplestring[10];
Run Code Online (Sandbox Code Playgroud)

在前两种情况下,的类型samplestringchar *,因此sizeof(samplestring)return sizeof(char *),在您的平台上为4。

在第三种情况下,类型samplestringchar[10](10个字符的数组),但是如果调用以a char *为参数的函数,则char数组将衰减为指向该数组第一个元素的指针。在这种情况下,尝试sizeof在函数中进行打印仍会导致打印指针的大小。

如果要从函数中打印原始数组的大小,则函数参数必须是指向原始数组类型的指针(并且该类型包括原始数组的大小)。

#include <stdio.h>

void foo( char (*arr)[42] )
{
  printf( "%u", (unsigned)sizeof(*arr) );
}

int main()
{
  char arr[42];
  foo( &arr );

  return 0;
}  
Run Code Online (Sandbox Code Playgroud)

输出:

42
Run Code Online (Sandbox Code Playgroud)

这确定了可以传递给函数的数组大小,这在许多情况下是不希望的。唯一的其他解决方案是自己跟踪数组(strlen如果您使用NULL终止的字符串,则使用此方法)。