DevC++上出现了一个奇怪的sizeof()错误

A strange sizeof() bug occured on DevC++

本文关键字:一个 错误 sizeof DevC++      更新时间:2023-10-16

我知道我不应该使用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…有什么想法吗?

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

请注意-其他人说大小取决于操作系统,这是正确的一半。这实际上取决于构建。sizeof是一个编译时构造。

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

事实上,你的sizeof指令告诉你int*的大小,这是设计出来的,所以这不是编译器的错,而是你的误解。没有办法使用sizeof来判断动态分配的数组的大小。

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));

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

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

int* a;
cout<<sizeof(a);

相当于:

cout<<sizeof(int*);

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

这里还有一个误解,即

int a* = new int[5];

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

int a*表示您正在声明一个指向int的指针。

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

int a* = new int[5];表示您正在为存储5个int分配内存,并将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]);

做你想做的事情的简单方法:

    #define NumberOfInts 5
    int* a = new int[NumberOFInts];
    for(int i = 0; i<NumberOfInts; i++){ 
    ....
    }    

我不确定这是否被普遍认为是"好风格",但它会修复你的代码。

您只得到指针的大小,而不是数组的大小

我通常使用以下代码:

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;
}

相关文章: