_msize(ptr)很棒,并且使用VLA衰减指针,我该怎么办?

时间:2019-01-09 09:09:27

标签: c windows

(首先:此代码旨在仅在Windows10上运行,但在其他操作系统上的行为很有趣。当然,通过适当的功能更改_msize)

代码的第一部分。内存分配是使用malloc完成的,并且我使用_msize来打印函数中数组的元素号(我知道,出于内存分配的原因,我可能会有更好的值,但是我还没有观察到这种情况。如果您确实有这种情况,我很感兴趣,但这不是我提出这个问题的主要原因)

代码的第二部分:相同的想法,但具有可变长度数组。我有两个问题。首先,对于VLA,是否有_msize的等效项?其次, 我的程序挂起,_msize为什么不返回?

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

void myfoo(int *array) {
    printf("Nb elt of an array obtained from its pointer %d\n",_msize(array)/sizeof(int));
}

int main() {
    int n=1;

    printf("Part 1 : malloc\n");
    while(n>0) {
        printf("n : ");scanf("%d",&n);
        if (n<0) break;
        int *array;
        array=malloc(n*sizeof(int));
        for (int i=0;i<n;i++) {array[i]=i;}
        myfoo(array);
        free(array);
    }

    n=1;
    printf("Part 1I : Variable Length Array\n");
    while(n>0) {
        printf("n : ");scanf("%d",&n);
        if (n<0) break;
        int array[n];
        for (int i=0;i<n;i++) {array[i]=i;}
        myfoo(array);
    }
}

1 个答案:

答案 0 :(得分:0)

假设堆栈中的预期内存来自动态分配器分配的堆,则_msize的VLA(堆栈上)不是预期值:

  

[...返回堆中分配的内存块的大小。 ...]

     

[... _msize函数返回通过调用calloc,malloc或realloc分配的内存块的大小(以字节为单位)。 ...]

这就是为什么代码的第一部分应按预期工作而不是第二部分按预期工作的原因。

出于完整性考虑,当您传递数组时,它decays指向指针,因此该函数仅获取一个指针。因此,函数也应该接收数组中元素的数量(指针之外)。看到这个:Passing a multidimensional variable length array to a function