【问题标题】:What is the difference between int * and int a[size]int * 和 int a[size] 有什么区别
【发布时间】:2023-10-18 18:54:01
【问题描述】:
Case I: 
   int a[12];
   printf("%d",sizeof(a));

Case II:
    int *a = (int *)malloc(12*sizeof(int));
    printf("%d",sizeof(a));

上面两个代码sn-ps返回不同的输出,

  • 48 第一种情况
  • 4 第二种情况

为什么会这样?

【问题讨论】:

标签: c


【解决方案1】:

因为数组不是指针,反之亦然。期间。

详细地说,在 int a[12]; 的情况下,a 是一个数组,它有自己的属性。它是 array 类型,因此当您将数组名称传递给 sizeof 运算符时,它会为您提供 array 的大小(在您的情况下为 12 int s,乘以 int 的大小,4,共 48)。

OTOH,int *a = malloc(12*sizeof*a);(更正格式),a 是一个指针,在此使用 sizeof 只会给你指针本身的大小,而不是分配的内存大小(pointed by) 指向指针。

引用 C-faq,第 6 章,

问:但我听说char a[]char *a 相同?

答:完全没有。 (您所听到的与函数的形式参数有关)。数组不是指针,尽管它们密切相关。

数组声明char a[6] 要求为六个字符留出空间,名称为a。也就是说,有一个名为a 的位置可以坐六个字符。另一方面,指针声明char *p 请求一个存放指针的位置,名称为p。这个指针几乎可以指向任何地方:指向任何char,或指向chars 的任何连续数组,或者不指向任何地方。

注意事项:

  1. Please see this discussion on why not to cast the return value of malloc() and family in C.
  2. 为了使您的代码健壮和可移植,最好在分配语句中使用变量名本身而不是硬编码的数据类型。

【讨论】:

  • 那个时期感觉如此强大:D Plus 简短而简洁的答案,但我相信这个问题可能是重复的。
  • @Transcendental 谢谢。只希望所有人都能理解 period 的值。 :)
  • @SouravGhosh a[i] 和 *(a+i) 仪式一样吗?那么为什么它们是不同的数据类型道歉但是解释数组和指针的链接会有很好的帮助
  • @AAB 我认为你搞混了。两种表示都会给你相同的结果,但这里我们讨论的是类型。希望清楚。
  • 好吧,我知道它们是独立的数据类型,但是当内部完成操作时,a[i] 会转换为 *(a+i) rite?所以这里实际发生的事情你能不能给点启发
【解决方案2】:

数组和指针在 C 中是不同的数据类型。当数组用作 sizeof 运算符的操作数时,它给出了数组数据类型的大小。但是,当指针与sizeof 运算符一起使用时,会返回指针的大小。

标准说(C11-6.5.3.4):

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。 大小由操作数的类型决定

第一种情况下的操作数a的类型是int [12],而第二种情况下的操作数类型是int *

【讨论】:

    【解决方案3】:

    sizeof 运算符处理 type 的大小。 它不必对传递给它的操作数所持有的内容做任何事情

    int a[12] 作为int [12] 的类型,因此给出48(4*12) 的大小。

    int *a 是一个整数指针,sizeof 运算符给出了指针的大小( 4)。

    在这些情况下int a[12]int *a 并不相同。 请注意,sizeof 是数组不会衰减为指针的少数情况之一。

    【讨论】:

      【解决方案4】:

      您会得到不同的答案,因为在这两种情况下a 是不同的。

      int a[12]; — 在此 a 是一个数组,

      int *a = malloc(12*sizeof*a); — 在此 a 是一个指针。


      指针和数组在大多数地方可以互换使用,但这并不意味着它们是相同的东西。两者都有不同的属性(如 Sourav 所解释的)。

      【讨论】: