int* areaofsquare(int len,int width){
int value = len*width;
return &value;
}
int main() {
printf("area=%i\n",*areaofsquare(1,2));
return 0;
}
为什么我从此代码中得到内存错误?根据我的理解,我在此代码块中没有收到任何错误,为什么它不能正常运行?
帮帮我。
谢谢。
答案 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
的指针(即分配或可交付的规范),则可以选择以下选项:
使用堆内存。在将其值打印后,将area
与malloc
分配给free
,并在main
中将static
分配给area
。
使用ResolveUsing
将void ResolveUsing(Func<TSource, TResult> mappingFunction);
放入进程的数据部分而不是堆栈存储器中,这样它就可以保存到其作用域之外,并且其操作地址将继续起作用函数返回后。