c语言srand作用域,如何将一个函数中的局部变量用指针调用到另一个函数中去

如题如何解决

static UINT Keyhsq(VOID)   / /  VOID改成int *

{

int i, j, k, a[5],rto[50], temp1, temp2, m, t;

srand((unsigned)time(NULL));

t = rand()%3 + 1;

for(k = 0; k 

{

loop: temp1 = rto[k] = rand()%50;

for(m = 0; m 

if(temp1 == rto[m])

goto loop;

if(temp1 == 0)

goto loop;

else m++;

}

for(i = 0; i 

{

loop1:temp2 = a[i] = rand()%6;

for(j = 0; j 

if(temp2 == a[j])

goto loop1;

if(temp2 == 0)

goto loop1;

else j++;

}

return 0

}

STDCALL VOID KeyOuthsq(VOID)

{

U8 *NoiOt;

U8 *RtOChoose;

u8 NoiOtIoNumChoose;

NoiOtIoNumChoose = Keyhsq(t);

NoiOt = Keyhsq(a[i]);

uTry = Keyhsq();

RtOChoose = Keyhsq(rto[k]);

}

上面keyhsq()函数中的a[ i ]、rto[ k ]、t; 要如何经过指针,或其他方式实现在keyouthsq()函数上调用。或者在全局变量中定义之后如何实现keyhsq()函数对其赋值运算,之后再keyouthsq()函数中调用。

(PS:初学C,还请各路大神多多指点)

5分

你定义为全局变量 ,在任何一个子函数中都可以使用了。

5分

函数内部的局部变量,在函数调用返回时,就已经无效了,返回指针当然可以访问,但是无意义了!

原因:x86下,每次函数调用,都要在栈上生成一个新的栈帧,局部变量就在此栈帧中进行分配,当函数返回时,此栈帧就要撤销。

假设A call B, 从B中返回一个局部变量的指针p,然后A call C,那么p可能就指向了函数C的局部变量,因为B返回后再调C,栈帧就重新分配给C了

5分

既然是局部变量, 那就不要想了,  这是危险的, 结果是不可预知的.

可以是局部静态变量,全局变量等等

5分

同一文件可以static,否则只能全局,这种变量在小程序无所谓,程序大了就要小心

静态局部变量作用域受到限制, 搞一个全局变量。

为什么到处充满了goto

这么一个程序各种goto,真是醉了,要么加static了return,要么全局变量

5分

使用全局变量不会麻烦死人的。

不使用全局变量也不会爽死人的。

引用 4 楼 xiaohuh421 的回复:

既然是局部变量, 那就不要想了,  这是危险的, 结果是不可预知的.

可以是局部静态变量,全局变量等等

!要是定义了全局变量,要怎么实现在上一个函数里运算,下一个函数里调用上一个函数运算的值。!

引用 8 楼 zhao4zhong1 的回复:

使用全局变量不会麻烦死人的。

不使用全局变量也不会爽死人的。

要是定义了全局变量,要怎么实现在上一个函数里运算,下一个函数里调用上一个函数运算的值呢?

在外部定义,然后作为这两个函数的参数。

如果要使用的变量比较多,建议封装起来做成一个struct,然后定义一个全局的结构体实例,至于是不是static是你的需求而定,这样操作起来就比较方便了。

25分

引用 10 楼 zdlhsq 的回复:

Quote: 引用 8 楼 zhao4zhong1 的回复:

使用全局变量不会麻烦死人的。

不使用全局变量也不会爽死人的。

要是定义了全局变量,要怎么实现在上一个函数里运算,下一个函数里调用上一个函数运算的值呢?

#include 

int g_var;

void fun1() {

gvar++;

}

void fun2() {

gvar*=2;

}

int main() {

g_var=1;

fun1();

fun2();

printf("%d\n",g_var);

return 0;

}

20分

引用 9 楼 zdlhsq 的回复:

!要是定义了全局变量,要怎么实现在上一个函数里运算,下一个函数里调用上一个函数运算的值。!

赵老师已经给了这个问题和答案了.

全局变量即是全局的,  你的上一个函数可以把运算结果保存到这个全局变量中, 下一个函数就可以使用这个全局变量得到上一个函数运算的值.

我把赵老师的代码给你注释下

#include 

int g_var;   //全局变量 定义

void fun1() {

gvar++;   //fun1中计算修改了全局变量, 相当于你计算了一个值, 保存在全局变量中了.

}

void fun2() {

gvar*=2;  //第二个函数中直接使用这个全局变量, 它不但使用这上一个函数的计算结果, 自己也会计算并保存一个值到全局变量中

}

int main() {

g_var=1;

fun1();  //执行完这个, g_var = 2;  内部自加1了

fun2();  //执行完这个函数  g_var = 4;    内部使用上个函数计算结果2, 然后2*2=4

printf("%d\n",g_var);  //这里会输出4

return 0;

}

10分

函数里用局部指针, 局部指针返回

感谢两位的指导,明白了,不过我采用了#15楼的方法。

引用 16 楼 zdlhsq 的回复:

感谢两位的指导,明白了,不过我采用了#15楼的方法。

引用 8 楼 zhao4zhong1 的回复:

使用全局变量不会麻烦死人的。

不使用全局变量也不会爽死人的。

在今后的峥嵘岁月中,用心体会我这两句话。

请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比

图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)

哪个处理信息更方便、更高效。

所以

与其费劲去重构代码让其看上去更简洁、更合理

不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。

有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值