1

我正在尝试获取由 stdin 填充的数组的大小:

char *myArray;
cin >> myArray
cout << sizeof(myArray);

当我输入一个长度大于 4 的字符串时返回 4,例如“40905898”

我哪里错了?

4

8 回答 8

11

sizeof运算符静态评估您传递给它的东西的大小。Achar*是一个指针,取决于机器架构,它具有特定的大小(32 位系统上为 4 字节,64 位机器上为 8 字节)。为了完成你想要做的事情,我建议你使用string可以通过添加到源文件中来#include <string>使用的类型。using namespace std;

string line;
cin >> line;
cout << line.length() << endl;

它不易出错且更易于使用。

顺便说一句,你试图做的事情真的很危险。实际上,当您使用 时cin >> myArray,您应该已经分配了一些尚未分配的内存myArray。这将导致内存损坏,这可能会使您的程序崩溃并可能将其置于缓冲区溢出攻击中。

C++ 中的简单数组不知道它的大小。sizeof 仅当数组是静态分配的并且您在数组本身上使用时才可以使用sizeof,而不是另一个指向它的指针,例如,这不会像您期望的那样工作:

int x[5];
int *a = &x[0];
// a[i] is now the same as x[i] but:
cout << sizeof(x) << endl; // prints 20, assuming int is 32 bits long
cout << sizeof(a) << endl; // prints 4, assuming a pointer is 32 bits long

请注意,数组的总大小打印在第一行,而不是元素计数。您可以使用它sizeof(x)/sizeof(*x)来找出静态数组中的元素计数。这对于使用动态分配的数组是不可能的new。事实上,C++ 数组非常容易出错,在使用它们时应该格外小心,并且在大多数情况下最好使用vectorand 。string

于 2008-12-18T12:46:09.920 回答
2

sizeof(pointer) 将始终返回 4。您想使用 strlen()。

编辑:IIRC,sizeof 在编译时评估,它只关心类型,而不关心内容。

于 2008-12-18T12:39:27.780 回答
1

这是因为 myArray 是一个占用 4 个字节的指针。如果要获取字符串的长度,请使用 strlen 或类似的东西。

于 2008-12-18T12:40:00.057 回答
0

您在这里似乎有很多问题:

myArray 未初始化 - 输入在哪里?

你通常使用:cin >> myArray; (注意人字形和分号的方向)

sizeof(myArray) 将始终返回相同的值(在您的平台上为 4)

试试这个版本:

char* myArray= new char[50];
cin >> myArray;
cout << myArray;
cout << strlen(myArray);

它并非没有自己的问题(我应该删除 myArray),所以你应该在这里尝试使用的答案string myArray

于 2008-12-18T12:50:40.350 回答
0

这是因为您在指针上使用 sizeof(),在 32 位计算机上是 4 个字节:

printf("Pointer size: %d\n", sizeof(void*));

如果您的数组是以 null 结尾的字符串(最后一个元素是零字节或 '\0'),那么您可以使用

strlen(myArray)

获取元素的数量(减一)。例如:

myArray = "Hello, world!";
printf("Number of characters: %d\n", strlen(myArray));

您还可以使用静态分配的数组,如下所示:

 char array[128];
 printf("sizeof(array) = %d\n", sizeof(array));
 // prints 128
于 2008-12-18T12:51:00.050 回答
0

正如其他人所说, myArray 是一个指针。

但是你为什么不使用std::string呢?您不需要自己进行缓冲区分配,这在您的示例中是错误的(指针myArray指向任何内容)

std::string myValue;
std::cin >> myValue;
std::cout << myValue.length();

如果需要,您可以使用string::c_str().

于 2008-12-18T12:51:27.930 回答
0

正如其他人所说sizeof,返回传递给它的对象的大小,对于指针,它是指针的大小。sizeof不跟随指针来查看指向的对象的大小(它怎么知道它可以指向一个char或指向一个数组,没有好方法知道)。

此外,当您读取时,cin您必须分配一些必须读取数据的空间,cin不会为您分配空间。您可以在堆栈或堆上分配空间:

char stack_line[1024]; // This will overflow if more than 1024 chars are needed
char heap_line*  = new char[1024]; // ditto

这里要注意的是,sizeof(stack_line) == 1024虽然sizeof(heap_line) == 4 [在 32 位机器上]所以你在使用操作符时必须小心sizeof

在实践中,最好使用std::string知道如何分配空间本身的 an。

于 2008-12-18T12:53:46.193 回答
0

好吧,如果你要使用 sizeof(myArray),你应该使用 sizeof(*myArray); 因为使用指针,没有星号是地址而不是值。像这样:

char *myArray;
cin >> *myArray;
cout << *myArray;
于 2014-11-25T18:11:18.600 回答