如何找到动态数组的大小

时间:2018-02-24 02:44:38

标签: c dynamic-memory-allocation

有什么方法可以找到在此代码中为;WITH a AS( SELECT * FROM (VALUES ('name a',0), ('name b',1), ('name c',2), ('name d',3)) x(name, intID)) , b AS( SELECT * FROM (VALUES ('day1',0), ('day2',0), ('day3',1), ('day4',0), ('day5',0), ('day6',0), ('day7',3), ('day8',0)) y(Occurrences, intID)) SELECT 'Item #' + CONVERT(nvarchar(10), b.intID) + ' ' + a.name as result FROM b INNER JOIN a ON b.intID = a.intID 分配了多少字节

RandomArray

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

5 个答案:

答案 0 :(得分:3)

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

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

另外不要忘记释放记忆。

答案 1 :(得分:3)

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

  • 您将N整数N在[{1}}至0之间,包括100之间分配内存。
  • 然后您将10应用于指针(sizeof)及其指向的内容(int*)。你分配多少内存并不重要。此行的输出将相同。

  • 此处没有错误检查。如果它是你无法确定它是否完全成功,因为int可能会给rand()结果。您需要将其存储在某处并检查它是否为0,因为在这种情况下0可能会或可能不会返回malloc

  • 使用NULL格式说明符打印sizeof返回的内容。它返回%zu

  
      
  • 更清楚地记得它是一个指向动态分配内存的指针。 size_t不是数组 - 它是指向连续内存的指针。这不会使它成为阵列。它仍然是一个指针。你想要应用的RandomArray技巧sizeof是一个数组是行不通的。一般来说,我们会跟踪它 - 使用一些变量。但是在这里你不知道你分配了多少内存。
  •   
    当您将RandomArray传递给它时,
  • malloc可能会返回NULL。单独处理该案件。如果您获得0并在sz!=0中错误地获取NULL

    RandomArray

在所有这些讨论之后 - 简短的回答是,使用此设置到目前为止没有使用代码(您编写的代码)。你不知道malloc中那个案例返回的 size_t sz = rand()%11; RandomArray = malloc(sz); if(!RandomArray && sz){ perror("malloc"); exit(EXIT_FAILURE); } 是什么。

答案 2 :(得分:2)

由于表达式*RandomArray的类型为intsizeof(*RandomArray)的计算结果为sizeof(int)。它没有告诉你分配了多少内存。

在动态分配内存时,您需要跟踪自己分配的内容。在上面的例子中,您需要将随机数存储在某个位置,以便知道该数量是多少。

答案 3 :(得分:0)

如果要查找为sizeof(RandomArray)

分配的字节数,

RandomArray总是会产生4个字节(等于指针大小)

/* 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撰写的C编程语言& Kernighan的

 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;

永远不会使用Align字段; 它只会强制每个标题在最坏情况边界上对齐。 在malloc中,请求的字符大小向上舍入为正确数量的标题大小的单位;要分配的块包含 另一个单位,对于header本身,这是记录在中的值 标题的size字段。 malloc返回的指针指向可用空间,而不是标题本身

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

        -> a block returned by malloc 

答案 4 :(得分:0)

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

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

RandomArray的类型为int **RandomArray的类型为int

因此,表达式相当于:

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

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

  

How to find the size of dynamic array

从您动态分配内存的位置跟踪 size

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

  

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