程序找错 下面一段程序有什么错,找出并改正

widon1104 2016-12-22 01:32:26
#include <stdio.h>

char *foo(void **handle)
{
char str[] = "okay\n";
*handle = 1;
return str;
}

int main(void)
{
void **handle;

char *result;
result = foo(handle);
if (*handle == 1) {
printf("%s", result);
}
return 0;
}
...全文
258 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-23
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,……
AlbertS 2016-12-22
  • 打赏
  • 举报
回复
不要返回局部变量,标准对于这种行为未定义
小灸舞 版主 2016-12-22
  • 打赏
  • 举报
回复
返回局部变量的地址是未定义行为
自信男孩 2016-12-22
  • 打赏
  • 举报
回复

#include <stdio.h>

char *foo(int *handle)
{
    static char str[] = "okay\n";
    *handle = 1;

    return str;
}

int main(void)
{
    //void **handle;
    int handle;

    char *result;
    result = foo(&handle);
    if (handle == 1) {
        printf("%s", result);
    }
    return 0;
}
问题1, 使用野指针,handle就是野指针,如果单从你的去求是从函数foo中获取一个标志值,没必要使用二重指针,直接使用一重指针即可. 问题2: 获取栈上的地址;函数foo中str数组是栈上空间,获取其地址,然后在main函数里再次使用没有意义.因为foo函数调用完后栈空间会被自动释放,在使用没有意义,很容易被别的程序再次申请foo的使用过的栈空间. 改的方法:handle使用了变量,str使用了静态数组,因为字符串"oky\n"是在数据段,不会跟着foo的释放而无效,所以main函数也可以读到正确的字符串..
幻夢之葉 2016-12-22
  • 打赏
  • 举报
回复
#include <stdio.h> char *foo(void **handle) { char str[] = "okay\n"; *handle = 1; //void* 的数据不能直接被使用,地址用int 赋值也不匹配 return str; } int main(void) { void **handle; //没有分配内存就直接使用 char *result; result = foo(handle); if (*handle == 1) { printf("%s", result); } return 0; }

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧