11

有很多类似的查询,但就我而言,我不明白什么不起作用:

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.";

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

4

6 回答 6

15

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

在 C++ 中,您将使用std::stringandlength()方法。

在 C 语言中,您将使用strlen以 NULL 结尾的字符指针作为参数。

于 2012-09-10T14:40:32.540 回答
5

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

你还没有展示如何samplestring声明。它可能是以下之一:

char const *samplestring = "Hello, World!";

或者

char *samplestring = malloc( ... );

或者

char samplestring[10];

在前 2 种情况下,类型samplestringchar *,所以sizeof(samplestring)返回sizeof(char *),在您的平台上是 4。

在第三种情况下,类型samplestringchar[10](10 个字符的数组),但如果调用以 achar *作为参数的函数,则 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 结尾的字符串,则使用)。

于 2012-09-10T14:49:34.853 回答
4

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

char samplestring[] = "hello";
char * samplestring = "hello";

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

以下将始终为正确以空字符结尾的字符串提供正确的长度,但速度较慢。

mysize = strlen(samplestring);
于 2012-09-10T14:43:43.617 回答
1

看起来好像你有一个指针,而不是一个数组。当程序需要时,数组会转换为指针,所以你会得到:

size_t size(char * p) { // p is a pointer
    return sizeof(p) / sizeof(*p); // size of pointer
}

size_t size(char p[]) { // p is also a pointer        
    return sizeof(p) / sizeof(*p); // size of pointer
}

虽然,因为sizeof (char) == 1,这里的除法是多余的;如果指针指向更大的类型,那么您会得到不同的意外结果。

在 C++(但显然不是 C)中,您可以将数组的大小推断为模板参数:

template <typename T, size_t N>
size_t size(T (&)[N]) {
    return N;  // size of array
}

或者您可以使用 和 等类std::vectorstd::string跟踪大小。

在 C 中,您可以使用strlen来查找以零结尾的字符串的长度,但在大多数情况下,您需要自己跟踪数组大小。

于 2012-09-10T14:48:47.427 回答
0

您在询问 char 上指针的大小。所以我猜你使用的是32位系统。

如果您使用 C++,请使用 std::string :

std::string samplestring("Hello world");
std::cout << samplestring.size() << std::endl;
于 2012-09-10T14:41:12.917 回答
0

元素的 sizeof 返回为该对象分配的内存大小。在您的示例中,字符串可能在某处声明为

samplestring[4]

在这种情况下,内存大小为 4。您可能希望在应用程序中使用的方法是

strlen(samplestring);

它返回空终止字符串的大小(没有终止)

于 2012-09-10T14:42:37.900 回答