0

嗨,我正在做这个练习,想在将指向数组的指针传递给函数后获取数组的大小:

但是 sizeof() 运算符不适用于指针,但适用于数组名称。为什么会这样?这是我可以在 findPut 函数上获得数组大小的任何方式吗?

#include <stdio.h>

//global vars
int i,j;
//functions prototypes
void findPut(int *, int);

int main(void){
    int ins=4;
    int arr[10]={1,2,3,5,6,7,8};
    printf("%d\n",sizeof(arr));     //gives 40
    int *ap=arr;
    printf("%d\n",sizeof(*ap));     //gives 4 instead of 40 why?? if ap and arr the same thing


    findPut(ap, ins);
    return 0;
}

//functions
void findPut(int *p, int n){
    //vars
    //getting size of array
    int size= sizeof(*p);   
    //sizeof(int);
    printf("%d\n",size);        //gives 4 but expected 40????

}
4

3 回答 3

3

当您取消引用时,*p您会得到一个int,所以它返回 4 (这是int您平台上的大小)。

于 2013-06-08T13:06:54.793 回答
3

因为,sizeof(*ap)意味着sizeof(arr[0]);由于数组的类型是int, sizeof(int)因为在您的系统配置中,int大小是4您得到的结果4

您可以通过打印的值自行尝试*p,您将获得 的值arr[0]

int *p是一个指针和int arr[10]

请注意:

  1. Arrays和指针不等价
  2. sizeof运算符是编译时运算符。
  3. sizeof(arr), 评估为10*sizeof(int), 这就是10*4=40你的情况。
  4. 当您取消引用 p (获取 p 指向的值)时,它不会给您整个数组,而是给您数组的一个单元,即intso,*p表示arr[0]. sizeof(arr[0])是 4(在你的情况下),这很明显。
  5. 当您使用sizeof(p)时,它会为您提供机器中指针的大小。在我的机器上是 8。
  6. main函数的返回类型应int始终为。它必须向操作系统报告程序的退出状态。如果你使用void它可能会返回随机垃圾。

该示例演示了该问题:

#include<stdio.h>
#include<stdlib.h>
int main(){
  int *p=NULL;
  int arr[10]={10,1,2,3,5,6,7,8,9,10};
  p=arr;
  printf("values: arr[0]=%d  *p= %d\n\n",arr[0],*p);
  printf("sizes : sizeof(arr[0])=%lu, sizeof(*p)= %lu sizeof(int)=%lu\n\n",sizeof(arr[0]),sizeof(*p),sizeof(int));
  printf("Sizeof pointer p: %lu \n\n",sizeof(p));
  printf("Sizeof arr: %lu \n\n",sizeof(arr));

  printf("Pointing p to the first byte of 100 byte sequence\n\n");
  p=malloc(100);

  printf("Though p is pointing 100 byte block, sizeof(p)=%lu",sizeof(p));
  return 0;
}

本质上,sizeof评估的是sizeof type但不是sizeof type它指向的。

谢谢,我非常感谢您的知识,但是有什么方法可以在另一个函数中找到数组的大小(不是我定义数组的那个)。

你不能在我的恕我直言!您必须将大小与数组一起传递。

例子:

 int main(){
   int arr[10]={10,1,2,3,4,5};
   printf("Length of array: %lu",findLength(arr,sizeof(arr)));
   return 0;
 }
 size_t findLength(int *p,int size){
    return size/sizeof(*p);
 }
于 2013-06-08T13:08:18.773 回答
0

你有一个int数组和一个int指针:

int arr[10] = {1,2,3,5,6,7,8};
int* ap;
ap = arr;

在 C 中,表达式arr等价于&arr[0]。因此,按理说,这*ap相当于arr[0],它是一个int,对于您的二进制文件,它的大小为 4。

您还需要了解数组和指针不是一回事。您可能对数组和指针经常互换使用这一事实感到困惑,因为指针可以存储数组开头的地址(换句话说,它的第一个元素)并导航连续的地址,就好像它有传递给它的实际数组。

于 2013-06-08T13:13:14.660 回答