3

我试图计算数组中的元素数,并被告知该行

int r = sizeof(array) / sizeof(array[0]) 

会给我数组中元素的数量。而且我发现该方法确实有效,至少对于 int 数组。然而,当我尝试这段代码时,事情就坏了。

#include <iostream>
#include <Windows.h>
using namespace std;

int main() {
    char binaryPath[MAX_PATH];
    GetModuleFileName(NULL, binaryPath, MAX_PATH);
    cout << "binaryPath: " << binaryPath << endl;
    cout << "sizeof(binaryPath): " << sizeof(binaryPath) << endl;
    cout << "sizeof(binaryPath[0]: " << sizeof(binaryPath[0]) << endl;

    return 0;
}

当这个程序运行 binaryPath 的值是

C:\Users\Anish\workspace\CppSync\Debug\CppSync.exe

这似乎有一个 sizeof 返回的大小(以字节为单位?位?idk,有人可以解释一下吗?)为 260。该行

sizeof(binaryPath[0]);

给出值 1。

显然,然后将 260 除以 1 得到 260 的结果,这不是数组中元素的数量(据我计算,它是 42 左右)。有人可以解释我做错了什么吗?

我有一个偷偷摸摸的怀疑,它实际上不是我认为的数组(我来自 Java 和 python),但我不确定,所以我问你们。

谢谢!

4

4 回答 4

7

260 is MAX_PATH, which you're getting because sizeof returns the size of the entire array - not just the size of the string inside the array.

To get the behavior you're looking for, use strlen instead:

cout << "binaryPath: " << binaryPath << endl;
cout << "strlen(binaryPath): " << strlen(binaryPath) << endl;
于 2013-04-17T14:03:24.343 回答
5

If you are looking for the size of the string then you need to use strlen, if you use sizeof it will tell you the allocated amount not the size of the null terminated string:

std::cout << "strlen(binaryPath: " << strlen(binaryPath) << std::endl;

You will need to add #include <cstring> on the top.

于 2013-04-17T14:03:12.323 回答
3

您将数组的大小与其包含的字符串的长度混淆了。sizeof(arrayVar)为您提供数组的整个大小,而不管它包含的字符串有多长。您需要使用它strlen()来确定它所包含的字符串的实际长度。

于 2013-04-17T14:04:24.770 回答
3

回想一下,C++ 和 C 中的 char 数组用于存储原始字符串,并且此类字符串的结尾由空字符标记。

该运算符sizeof不是动态的:它将为您提供整个数组的大小,或者您以字节(或字符,因为它们具有相同的大小)提供的任何类型,如您的代码中所定义。因此260肯定是 的值MAX_PATH,用于定义 char 数组binaryPath

GetModuleFilename根据上述约定,调用后存储在该数组中的字符串将以空值终止。为了获得它的长度,您需要计算其中的字符,直到达到空字符或使用strlenC 库提供的函数。

一些指示:

于 2013-04-17T14:18:06.250 回答