有人告诉我,函数fun()是否正确?
#include <stdio.h>
#include <stdlib.h>
int *fun(int *, int *, int, int);
int main(void) {
int v1[] = {1,2,3,4,5};
int v2[] = {6,7,8,9,10};
int v1Size = sizeof(v1)/sizeof(v1[0]);
int v2Size = sizeof(v2)/sizeof(v2[0]);
int *v = fun(v1, v2, v1Size, v2Size);
if(v == NULL)
exit(EXIT_FAILURE);
for(size_t i = 0; i < v1Size; ++i)
printf("%d ", v[i]);
}
int *fun(int *v1, int *v2, int v1Size, int v2Size){
if(v1Size!=v2Size)
return NULL;
const int size = v1Size;
int v[size];
for(int i=0; i<size; i++)
v[i]=v1[i]+v2[i];
int *p = v;
return p;
}
对我来说,它会返回指向内存的指针,该指针将在离开功能体后释放。但是valgrind没有显示任何错误,它运作得很好。
答案 0 :(得分:3)
工作得很好
停止!!它是调用undefined behavior的可能结果之一。
正如您正确提到的那样,返回的指针在从{返回后“通常不会有效( VLA驻留在自动范围(堆栈)中,如if (value.type == 'Firewall URL') {
//Will check each detail appended
$('.detailsFirewall').each(function(){
//Now you can reference this to get current element in iteration
if ($(this).attr('id') == 'Firewall' + value.thing_id) {
$('#Firewall' + value.thing_id).wrap('<a target="_blank" href="' + value.value + '" />');
}
})
}
) {1}}。使用返回值将导致UB。
答案 1 :(得分:3)
返回局部变量的地址不是&#34;罚款&#34;。函数退出后,v
不再存在,因此任何指向它的指针都不再有效。显然,v
占用的存储仍然存在,只要没有其他内容覆盖该存储,您的代码将显示以正常运行。
注意的重点出现。您的代码可能很容易崩溃,或者输出乱码,或者处于不良状态。这取决于您如何使用返回的指针值。
v
具有auto
存储持续时间,这意味着它的存储在函数入口处分配并在函数出口处释放。 Valgrind并没有对此表示嘘声,因为这并不是Valgrind所检查的那种。