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

时间:2012-09-10 14:39:01

标签: c++ c sizeof

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

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

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

6 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:4)

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

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

尝试以你正在做的方式获取第二种情况的大小只是给你一个指针的大小。在32位构建中,指针的大小为4个字符,即指针占用4个字符的相同内存量。

以下总是为正确的以null结尾的字符串提供正确的长度,但速度较慢。

mysize = strlen(samplestring);

答案 2 :(得分:4)

首先,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)会返回sizeof(char *),在您的平台上为{<1}}。

在第三种情况下,samplestring的类型是char[10](10个字符的数组),但是如果你调用一个以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

这修复了可以传递给函数的数组的大小,在很多情况下是不可取的。唯一的其他解决方案是自己跟踪数组(如果你有一个以NULL结尾的字符串,则使用strlen。)

答案 3 :(得分: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来查找以零结尾的字符串的长度,但在大多数情况下,您需要自己跟踪数组大小。

答案 4 :(得分:0)

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

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

std::string samplestring("Hello world");
std::cout << samplestring.size() << std::endl;

答案 5 :(得分:0)

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

samplestring[4]

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

strlen(samplestring);

返回以null结尾的字符串的大小(没有终止)