gpt4 book ai didi

c - _msize(ptr) 很棒,并且 VLA 衰减指针,我能做什么?

转载 作者:行者123 更新时间:2023-11-30 16:23:09 30 4
gpt4 key购买 nike

(首先:此代码仅在 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);
}
}

最佳答案

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

[...Returns the size of a memory block allocated in the heap. ...]

[... The _msize function returns the size, in bytes, of the memory block allocated by a call to calloc, malloc, or realloc. ...]

这就是为什么代码的第一部分应该按预期工作,但第二部分却不能。

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

关于c - _msize(ptr) 很棒,并且 VLA 衰减指针,我能做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106536/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com