C + +代码块确定,但仍然无法编译

时间:2019-01-30 16:31:19

标签: c++ c

int* areaofsquare(int len,int width){
    int value = len*width;
    return &value;
}

int main() {
    printf("area=%i\n",*areaofsquare(1,2));
    return 0;

}

为什么我从此代码中得到内存错误?根据我的理解,我在此代码块中没有收到任何错误,为什么它不能正常运行?

帮帮我。
谢谢。

2 个答案:

答案 0 :(得分:1)

您不能只返回指向堆栈变量的指针,因为随着函数的返回,该变量变得无效。您可以改为使用动态内存分配:

int* area(int leangth,int width){
    int * area = malloc(sizeof(int));
    *area = leangth*width;
    return area;
}

int main() {
    printf("area=%i\n",*area(5,6));
}

请注意,这会造成内存泄漏,最好以某种方式处理它,但是在这个小例子中,这没关系。

答案 1 :(得分:0)

您正在返回函数area中的局部函数变量的地址。当函数返回时,其堆栈空间不再有效,因此尝试从该函数访问本地变量的地址是未定义的行为。

我不明白为什么需要让area返回一个指向int的指针。只需返回area的值,并将area的返回类型改为int

如果由于某些原因需要返回指向int的指针(即分配或可交付的规范),则可以选择以下选项:

  1. 使用堆内存。在将其值打印后,将areamalloc分配给free,并在main中将static分配给area

  2. 使用ResolveUsingvoid ResolveUsing(Func<TSource, TResult> mappingFunction); 放入进程的数据部分而不是堆栈存储器中,这样它就可以保存到其作用域之外,并且其操作地址将继续起作用函数返回后。