提问人:Tanmay Deshpande 提问时间:2/24/2018 最后编辑:user2736738Tanmay Deshpande 更新时间:2/25/2018 访问量:14577
如何找到动态数组的大小 [duplicate]
How to find the size of dynamic array [duplicate]
问:
有没有办法找到这段代码中分配了多少字节RandomArray
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *RandomArray;
int n;
srand(time(NULL));
RandomArray=malloc(sizeof *RandomArray * (rand()%11));
printf("%d %d",sizeof(RandomArray),sizeof(*RandomArray));
return 0;
}
另外,我不知道上面的代码是否会有任何实际用途。但我是从编程的角度来看的。
答:
是的,通过将大小保存在变量中:
int main()
{
int *RandomArray;
int n;
srand(time(NULL));
size_t size = rand() % 11;
if(size == 0)
{
fprintf(stderr, "Size 0, no point in allocating memory\n");
return 1;
}
RandomArray = malloc(size * sizeof *RandomArray)
if(RandomArray == NULL)
{
fprintf(stderr, "no memory left\n");
return 1;
}
printf("%zu %zu\n", sizeof(RandomArray), size);
// don't forget to free the memory
free(RandomArray);
return 0;
}
请注意,这将返回指针需要存储在内存中的大小,并返回
一。sizeof(RandomArray)
int
sizeof(*RandomArray)
int
也不要忘记释放内存。
由于表达式的计算结果为 ,因此计算结果为 。它不会告诉您分配了多少内存。*RandomArray
int
sizeof(*RandomArray)
sizeof(int)
动态分配内存时,需要跟踪自己分配了多少内存。在上面的例子中,你需要将随机数存储在某个地方,这样你就知道这个数量是多少。
啊,这是实验性代码。有趣的事情就在那里。
- 您将为整数分配内存,其中介于 to including 和 之间。
N
N
0
10
0
10
然后,您应用了指针 () 及其指向的内容 ()。分配多少内存并不重要。此行的输出将是相同的。
sizeof
int*
int
这里没有错误检查。如果是这样,你无法判断它是否完全成功,因为可能会给出结果。您需要将其存储在某个地方并检查它是否是,因为在这种情况下可能会或可能不会返回。
rand()
0
0
malloc
NULL
使用格式说明符打印应完成的返回值。它返回 .
sizeof
%zu
size_t
- 更清楚的是,请记住,它是一个指向动态分配内存的指针。 不是一个数组 - 它是一个指向连续内存的指针。这并不能使它成为数组。它仍然是一个指针。而你想应用思维的诀窍是数组是行不通的。一般来说,我们跟踪它 - 使用一些变量。但在这里你不知道你分配了多少内存。
RandomArray
sizeof
RandomArray
malloc
当您传递给它时可能会返回。单独处理该案例。以防万一你遇到并陷入投掷错误。NULL
0
sz!=0
NULL
RandomArray
size_t sz = rand()%11; RandomArray = malloc(sz); if(!RandomArray && sz){ perror("malloc"); exit(EXIT_FAILURE); }
在所有这些谈话之后 - 简短的回答是,通过这种设置,到目前为止没有使用代码(您编写的代码)。你不知道 malloc 内部的那个案例返回了什么。rand()
sizeof(RandomArray)
如果要查找分配的字节数,则始终生成 4 个字节(等于指针大小)RandomArray
/* Since its implimentation dependent, so I'm not
advising you to access RandomArray[-1], also proper type casting needed */
printf("memory allocated = %d \n",RandomArray[-1]);
从
Denis Ritchie 和 Kernighan 的 C 编程语言
typedef long Align; /* for alignment to long boundary */
union header { /* block header */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};
typedef union header Header;
该字段从不使用;它只是强制每个标头在最坏情况下的边界上对齐。
在 中,请求的字符大小四舍五入到适当的标题大小单位数;将分配的块包含
对于它本身,还有一个单位,这是记录在标头字段中的值。malloc 返回的指针指向可用空间,而不是标头本身。Align
malloc
header
size
RandomArray[-1]
-----------------------------------------
| | SIZE | |
-----------------------------------------
RandomArray
-> a block returned by malloc
评论
malloc
malloc
RandomArray[-1]
RandomArray[-1]
RandomArray - 1
运算符在编译时工作,但操作数是可变长度数组的情况除外,动态内存分配是运行时操作。
在表达式中:sizeof
printf("%d %d",sizeof(RandomArray),sizeof(*RandomArray));
is 的类型和 is 的类型。RandomArray
int *
*RandomArray
int
因此,表达式等价于:
printf("%d %d",sizeof(int *),sizeof(int));
将产生整数常量的结果,因此,无论分配给 的内存大小如何,您每次都会得到相同的结果。sizeof
RandomArray
How to find the size of dynamic array
从动态分配内存的位置开始跟踪大小。
请注意,在分配内存时,您将返回的值乘以 ,并且可能也会返回,这将导致 .很高兴知道(来自 C 标准#7.22.3):rand()%11
sizeof *RandomArray
rand()
0
malloc(0)
....如果请求的空间大小为零,则行为是实现定义的:要么返回 null 指针,要么行为就像大小是某个非零值一样,但返回的指针不应用于访问对象。
评论
rand()%11
malloc(0)