3

我遇到了问题。我试图在不传递任何显式参数的情况下获取 int 数组中的元素数,只传递指向 int 数组的指针。现在我的好奇心:

int * set;
printf("-- %d --", sizeof(set)); //4
set=(int *) malloc(n*sizeof(int));
printf("-- %d --", sizeof(set)); //4  

为什么值是相同的,因为在 malloc 之前它没有被初始化并且在它之后。谢谢
更新:
有没有办法得到一个 int 数组的长度?

4

5 回答 5

9

因为sizeof在编译时进行评估并产生 的类型的大小set,指向int.

于 2012-05-04T20:36:35.997 回答
6

没有通用的方法来测量 C 中指针指向的内存大小,除了字符串按照约定以空值终止的特殊情况。

sizeof将产生指针的大小(在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节),而不是指向的内存。

如果要跟踪分配的内存大小,选项有:

  • 在单独的变量中跟踪它
  • 引入一个特殊的数组终止符(例如,int 如果您的应用程序永远不会有效地使用该值的最小值或最大值。
  • 使用备用内存管理库(因为dmallocdmalloc_examine,它将返回指向的内存大小)。除了您想使用其扩展内存 API 的地方之外,这些应该只需很少或没有代码更改即可直接使用。
于 2012-05-04T20:37:58.523 回答
3

您正在测量的项目set, 是一个指向整数 ( int*) 的指针。指向整数的指针是 4 字节。

sizeof测量分配给指针的内存量。它仅测量“项目”本身(在本例中为指针)。

于 2012-05-04T20:36:48.537 回答
0

指针是 32 位或 64 位。

意思是 4 或 8 个字节。

于 2012-05-04T20:36:43.937 回答
0
int * set;
printf("-- %d --", sizeof(set)); //4
set=(int *) malloc(n*sizeof(int));
printf("-- %d --", n*sizeof(int)); //n*sizeof(int) is the size of your malloc'd memory

希望有帮助。在您的最后一条语句中,您仍然在询问机器上 4 个字节的单个整数指针的大小。要获得 malloc 内存区域的大小,您需要使用与 malloc 函数内部相同的表达式。

并且整数指针不一定与 int 本身的大小相同,因为 Mat 纠正了我

于 2012-05-04T20:41:25.843 回答