2

我知道我不应该使用 Dev-C++,但它在学校是强制性的,所以我对此无能为力。

主题是 C/C++ 中的指针,并且在测量整数数组的长度时出现错误。请看下面的代码:

// POINTER
# include<iostream>
# include<string.h>

using namespace std;

int main(){
    //neues Feld anlegen
    int *a = new int[5];

    a[0] = 12;
    a[1] = 5;
    a[2] = 43;
    a[3] = -12;
    a[4] = 100;
    // Feld füllen

    for(int i = 0; i<sizeof(a);i++){
            cout<<a[i]<<"\n"<<endl;
            }
    cout<<sizeof(a);
    system("pause");
    return 0;

}

sizeof() 返回 4 而不是 5...有什么想法吗?

4

9 回答 9

26

这不是一个错误,因为它返回a自身的大小(类型为int*- 32 位构建上的 4 个字节),而不是数组的长度。

请注意- 其他人说大小取决于操作系统,这是对的。这真的取决于构建。sizeof是一个编译时构造。

于 2011-11-14T13:59:10.543 回答
5

首先,您不应该认为“奇怪”行为的罪魁祸首是编译器:大多数时候,错误是您的。

实际上,您的sizeof指令告诉您 an 的大小是多少int*,这是设计使然,因此这不是编译器的错,而是您的误解。没有办法用来sizeof告诉动态分配数组的大小。

于 2011-11-14T14:02:13.733 回答
2

a 在这种情况下是一个指针,指针的大小取决于编译器。

你正在做 sizeof(int*)。实际上,您使用的是 32 位编译器,并且您的编译器\系统指针是 32 位的。

您无法从指针中获取用 new 分配的对象的大小, sizeof 是在编译时评估的,而不是在运行时评估的。

要获得数组的大小,您应该这样做...

int a[5]; // Array allocated in stack, we can use sizeof.
std::cout << (sizeof(a) / sizeof(int));

sizeof 返回以字节为单位的大小,而不是数组上的元素数。

那段代码相当于写

std::cout << (sizeof(int[5]) / sizeof(int));
于 2011-11-14T14:02:23.720 回答
1

sizeof 不会告诉您数组大小。它告诉您数据类型的大小,在本例中为 int*,在您的平台上为 4 个字节。无论数组元素的数量如何,它始终为 4。

于 2011-11-14T14:00:20.000 回答
1

局部变量a是指针类型 ( int*)。在 32 位操作系统中,指针大小为 4 个字节。

于 2011-11-14T14:01:13.690 回答
1
int* a;
cout<<sizeof(a);

相当于:

cout<<sizeof(int*);

这是可变的,取决于平台。在大多数 x32 平台上,它将是 4 个字节,在 x64 平台上是 8 个字节。

于 2011-11-14T14:01:23.143 回答
1

你在这里的误解是

int a* = new int[5];

意味着您将 a 声明为指向int类型数组的指针。事实上并非如此。

int a* 意味着您正在声明一个指向int.

new int[5]表示您正在为 5int种类型分配内存空间。

int a* = new int[5];意味着您正在分配内存以存储 5 个整数并将 int 点 a 设置为指向第一个元素。

如果你声明了一个数组:

int a[5];  // an array of 5 ints

那么你可以:

for (int i=0; i< (sizeof(a)/sizeof(a[0])); i++)
{
  cout<<a[i]<<"\n"<<end1;
}  

cout<< sizeof(a)/sizeof(a[0]);
于 2011-11-14T14:24:06.053 回答
0

做你想做的更简单的方法:

    #define NumberOfInts 5

    int* a = new int[NumberOFInts];

    for(int i = 0; i<NumberOfInts; i++){ 
    ....
    }    

我不确定这是否通常被认为是“好风格”,但它会修复你的代码。

于 2011-11-14T14:16:09.207 回答
0

您只得到指针的大小,而不是数组的大小。如果将此代码编译为 64 位,您将得到另一个结果。

我通常使用下面的代码:

const int ARRAY_SIZE = 5;

int a* = new int[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i)
{
    // Do something.
}

// Release
if (a)
{
    delete[] a;
    a = NULL;
}
于 2011-11-14T15:28:05.690 回答