有很多类似的询问,但在我的情况下,我不明白什么是不起作用:
int mysize = 0;
mysize = sizeof(samplestring) / sizeof(*samplestring);
std::cout << mysize << '\n' << samplestring;
这输出:
4
Press 'q' to quit.
这怎么可能?4绝对不是这个字符串的大小.我甚至尝试了以下结果,结果相同:
mysize = sizeof(samplestring) / sizeof(samplestring[0]);
编辑:好的,这是声明:
char *samplestring = "Start."; 
我在C++上,但我需要使用只接受char*的函数.稍后在代码中我将新字符串分配给该变量,例如:
samplestring = "Press 'r' for red text.";
是的,编译器给了我警告,但我不知道如果我不能覆盖它们怎么能使用不同的字符串...
Luc*_*ore 13
4不是字符串的大小,因为samplestring它不是字符串.它是a char*,其大小(在你的平台上)4除以1(大小char)正确地为4.
在C++中,您将使用std::string和length()方法.
在C中,您将使用strlen将参数作为NULL终止的char指针.
有两种方法可以使字符串常量,而您的技术仅适用于第一种。第一个创建一个字符数组,您可以在编译时获取其大小,另一个创建一个指向字符数组的指针。
char samplestring[] = "hello";
char * samplestring = "hello";
尝试按照您的方式获取第二种情况的大小,只会得到指针的大小。在 32 位构建上,指针的大小为 4 个字符,即指针占用与 4 个字符相同的内存量。
以下内容始终会给出正确的空终止字符串的正确长度,但速度较慢。
mysize = strlen(samplestring);
首先,sizeof(samplestring[0])与相同sizeof(*samplestring),它们都返回samplestring数组第一个元素的大小。并且,假设samplestring是一个字符数组,sizeof(char)则定义为1。
您尚未显示如何samplestring声明。可能是以下之一:
char const *samplestring = "Hello, World!";
要么
char *samplestring = malloc( ... );
要么
char samplestring[10];
在前两种情况下,的类型samplestring为char *,因此sizeof(samplestring)return sizeof(char *),在您的平台上为4。
在第三种情况下,类型samplestring为char[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;
}  
输出:
42
这确定了可以传递给函数的数组大小,这在许多情况下是不希望的。唯一的其他解决方案是自己跟踪数组(strlen如果您使用NULL终止的字符串,则使用此方法)。