如何找到动态数组的大小 [duplicate]

How to find the size of dynamic array [duplicate]

提问人:Tanmay Deshpande 提问时间:2/24/2018 最后编辑:user2736738Tanmay Deshpande 更新时间:2/25/2018 访问量:14577

问:

有没有办法找到这段代码中分配了多少字节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;
    }

另外,我不知道上面的代码是否会有任何实际用途。但我是从编程的角度来看的。

c 动态内存分配

评论

1赞 yano 2/24/2018
不。。需要自己跟踪。
0赞 David C. Rankin 2/24/2018
而且你没有保存结果并验证它大于零,因为......?rand()%11
0赞 Pablo 2/24/2018
@DavidC.Rankin好吧,并不违法。malloc(0)
0赞 David C. Rankin 2/24/2018
它也不是很有用......
3赞 David C. Rankin 2/24/2018
是的,明白了,这里的整个问题是,如果你不保存你分配的大小,就没有魔杖可以挥舞来取回它......这是“打自己额头”类型的问题之一。

答:

4赞 Pablo 2/24/2018 #1

是的,通过将大小保存在变量中:

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)intsizeof(*RandomArray)int

也不要忘记释放内存。

3赞 dbush 2/24/2018 #2

由于表达式的计算结果为 ,因此计算结果为 。它不会告诉您分配了多少内存。*RandomArrayintsizeof(*RandomArray)sizeof(int)

动态分配内存时,需要跟踪自己分配了多少内存。在上面的例子中,你需要将随机数存储在某个地方,这样你就知道这个数量是多少。

3赞 user2736738 2/24/2018 #3

啊,这是实验性代码。有趣的事情就在那里。

  • 您将为整数分配内存,其中介于 to including 和 之间。NN010010
  • 然后,您应用了指针 () 及其指向的内容 ()。分配多少内存并不重要。此行的输出将是相同的。sizeofint*int

  • 这里没有错误检查。如果是这样,你无法判断它是否完全成功,因为可能会给出结果。您需要将其存储在某个地方并检查它是否是,因为在这种情况下可能会或可能不会返回。rand()00mallocNULL

  • 使用格式说明符打印应完成的返回值。它返回 .sizeof%zusize_t

  • 更清楚的是,请记住,它是一个指向动态分配内存的指针。 不是一个数组 - 它是一个指向连续内存的指针。这并不能使它成为数组。它仍然是一个指针。而你想应用思维的诀窍是数组是行不通的。一般来说,我们跟踪它 - 使用一些变量。但在这里你不知道你分配了多少内存。RandomArraysizeofRandomArray
  • malloc当您传递给它时可能会返回。单独处理该案例。以防万一你遇到并陷入投掷错误。NULL0sz!=0NULLRandomArray

      size_t sz = rand()%11;
      RandomArray = malloc(sz);
      if(!RandomArray && sz){
         perror("malloc");
         exit(EXIT_FAILURE);
      }
    

在所有这些谈话之后 - 简短的回答是,通过这种设置,到目前为止没有使用代码(您编写的代码)。你不知道 malloc 内部的那个案例返回了什么。rand()

1赞 Achal 2/24/2018 #4

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 返回的指针指向可用空间,而不是标头本身Alignmallocheadersize

              RandomArray[-1]                      
   -----------------------------------------
   |        |     SIZE     |               |
   -----------------------------------------
                                          RandomArray

        -> a block returned by malloc 

评论

0赞 Pablo 2/24/2018
标准中是否有任何内容可以保证在指针返回之前保存大小?我不认为你可以转述这一点。malloc
0赞 Pablo 2/24/2018
但这不就是一个实现细节吗?所有实现也都这样做吗?malloc
0赞 Achal 2/24/2018
如果无法分配请求的内存,则返回空指针。如果请求的空间大小为零,则行为由实现定义:返回空指针。
3赞 Dúthomhas 2/24/2018
虽然这个答案确实提供了有关常见实现细节的有用信息,但不幸的是,它是一个实现细节,即绝对不能保证以这种方式工作。此外,索引几乎肯定会失败——你需要比这更复杂的强制转换才能正确地做到这一点。RandomArray[-1]
2赞 ad absurdum 2/24/2018
这只是存储分配器的一个示例(来自 K&R 示例 8.7);该标准没有强制要求这样的标题。无论如何,我不确定这些知识会带来什么。尝试访问将是未定义的行为,甚至形成指针都是未定义的行为。RandomArray[-1]RandomArray - 1
0赞 H.S. 2/24/2018 #5

运算符在编译时工作,但操作数是可变长度数组的情况除外,动态内存分配是运行时操作。 在表达式中:sizeof

printf("%d  %d",sizeof(RandomArray),sizeof(*RandomArray));

is 的类型和 is 的类型。RandomArrayint **RandomArrayint

因此,表达式等价于:

printf("%d  %d",sizeof(int *),sizeof(int));

将产生整数常量的结果,因此,无论分配给 的内存大小如何,您每次都会得到相同的结果。sizeofRandomArray

How to find the size of dynamic array

从动态分配内存的位置开始跟踪大小


请注意,在分配内存时,您将返回的值乘以 ,并且可能也会返回,这将导致 .很高兴知道(来自 C 标准#7.22.3):rand()%11sizeof *RandomArrayrand()0malloc(0)

....如果请求的空间大小为零,则行为是实现定义的:要么返回 null 指针,要么行为就像大小是某个非零值一样,但返回的指针不应用于访问对象。