为什么使用sizeof运算符会产生不同的值?

时间:2015-07-22 22:14:18

标签: c++

#include <iostream>

using namespace std;

int main (void)
{
    int * p = new int(40);  // here `p` points to an array having space for 40 ints or space allocated is 40 bytes?
    for (int i = 0; i < 2; i++)
        cin>>p[i];
    cout<<sizeof(p)<<"\n";   // here, the output should be size of array since p points to an array
    int arr[5] = {1,2,3,4,5}; // since, here it will output 20 (space allocated for the entire array)
    cout<<sizeof(arr)<<"\n";
    return 0;
}

所以,我有两个问题(程序中的前两个评论)

  1. 此处p指向一个空间为40个整数或分配空间为40个字节的数组?

  2. 这里,输出应该是数组的大小,因为p指向一个数组,因为从技术上讲,arr也是一个指针,当我们*arr时,它引用了数组的第一个元素。

3 个答案:

答案 0 :(得分:3)

在您的代码中,p被定义为指针,因此sizeof(p)sizeof(int*)相同,32位系统为4,64位系统为8。

在第二种情况下,arr是一个静态数组,因此sizeof(arr)与返回sizeof(int[5])的{​​{1}}相同,假设没有填充或其他复杂的工作发生“引擎盖下”。

请注意,当您将数组名称作为参数传递给接受指针作为形式函数参数的函数时,数组会“衰减”到指针,因此在参数上调用5*sizeof(int)会产生您可能的行为没想到。例如:

代码清单

sizeof

示例输出

#include <stdio.h>

void printSize(int* arg);

int main(void)
{
    int *p;
    int arr[10];
    printf("sizeof p:%d\n", sizeof(p));
    printf("sizeof arr:%d\n", sizeof(arr));
    printSize(p);
    printSize(arr);

    return 0;
}

void printSize(int* arg)
{
    printf("sizeof arg:%d\n", sizeof(arg));
}

答案 1 :(得分:3)

当您说server.com/images/1.jpg?wid=120 时,实际上是为单个整数分配空间并使用整数int *p = new int(40);填充该空格。如果你想要一个40个整数的数组,你应该使用方括号:

40

所以,回答问题#1:两者都没有。分配的空间大小为系统上的一个int *p = new int[40];

回答问题#2:第一行输出是系统上单个指针的大小(因为int只是一个指针)。这可能与p的大小相同,可能是4个字节。第二行输出将是整数数组的总分配大小,因此它将是int40*sizeof(int)

答案 2 :(得分:1)

$string = convert_accented_characters($string); 的两种用途分别是查询类型sizeofint*的大小。

(另外,您有一个错误并且意味着int[5],而不是new int[40],但这不会影响new int(40)的结果