2

我正在阅读有关 C 中数组与指针的更多信息,并编写了以下程序。

#include <stdio.h> 

int arr[10] = { } ; 
typedef int (*type)[10]  ;
int main()
{
   type val = &arr ; 
   printf("Size is %lu\n", sizeof(val)) ; 
   printf("Size of int is %lu\n", sizeof(int)) ;
}

如果,我执行这个程序,则sizeof(val)给定为 8,sizeof(int)给定为 4。

如果val是指向具有 10 个元素的数组的指针,它的大小不应该是 40。为什么是sizeof(val)8 ?

4

6 回答 6

3

如果 val 是指向数组的指针...

是的,它是,并sizeof(val)产生“指向数组的指针”的大小,而不是数组本身。

......它的大小不应该是40吗?

不,sizeof(val)计算操作数的大小,这里的“指针”。在您的平台中,指针的大小似乎是 64 位,即 8 个字节。所以,它给出了8.

另外,正如我提到的,使用%zuto print size_t,由sizeof操作员产生的类型。

于 2015-06-25T08:15:39.827 回答
3

首先是数组的初始化

int arr[10] = { } ; 

在 C 中无效。您不能在 C 中使用空大括号(在 C++ 中它们是允许的)。你必须写

int arr[10] = { 0 } ; 

在 C 中,相应的初始化程序定义如下

initializer:
    { initializer-list }
    { initializer-list , }

在 C++ 中

braced-init-list:
    { initializer-list ,opt }
    { }

至于这个说法

printf("Size is %lu\n", sizeof(val)) ; 

thenval是一个指针,因为它的类型type定义如下

typedef int (*type)[10]  ;

将此语句更改为

printf( "Size is %zu\n",  sizeof( *val ) ); 

如果要获取指针指向的对象(即数组)的大小。

于 2015-06-25T08:21:01.793 回答
0

sizeof 返回指针本身的大小。在 64 位系统中,它是 8 个字节。指针不知道它们指向的缓冲区的大小。

于 2015-06-25T08:15:42.837 回答
0

Apointer是一种不同的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号的大小始终相同——无论它指向单个字符还是更大的数组。

于 2015-06-25T08:15:58.940 回答
0

val是指针,它的大小相当于系统的地址总线大小。所以,sizeof(val)或者sizeof(anyPointer)会给你8作为输出。如果您愿意,请40尝试sizeof(arr)

指向数组的指针是简单的指针,您可以在其中写入val++,而数组名称是constant pointer您无法写入arr++的。

你也可以检查这个链接

于 2015-06-25T08:18:49.230 回答
0

很可能您在需要内存地址或表示空间的64 bitPC 中。64 bits8 byte

现在pointer实际保存的是内存地址,而它可能保存一个地址int或者可能是一个地址int[],这无关紧要。

所以,当你执行时,

printf("Size is %lu\n", sizeof(val)) ; 

它显示8为因为指针保存需要64 bits空间的地址。

printf("Size of int is %lu\n", sizeof(int)) ;

这一行只打印字节的int大小4

于 2015-06-25T08:23:39.093 回答