这个程序是否正确?

时间:2016-06-08 18:42:13

标签: c memory-leaks return-value

有人告诉我,函数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没有显示任何错误,它运作得很好。

2 个答案:

答案 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所检查的那种。