指针变量最好作为全局变量

下面有一个程序。如果把fin,fout定义为全局变量,则一点事儿都没有,但是如果把fin,fout定义在主函数内部,则会发生异常,程序退出值为-1073741510。(Process terminated with status -1073741510)。

我整整排查了一个下午。

起初怀疑是自己程序的问题,里里外外检查了若干遍,没有发现错误。

后来发现把FILE* fin,换成ifstream fin,其他地方也一并照改,把文件指针全都换成了输入输出流,运行就正确了。

于是怀疑是用错了fprintf的问题。找了一些资料来看,自己的使用是正确的没有问题。

考虑到其他题目也是照样用fprintf做的,都没有问题。真是诡异。然后又怀疑是cena的问题。

但是同样的不可解释,其他题为何可以用fprintf,在cena上一样跑。

现在也没有搞明白是怎么回事。难道是bug?

 

 

本题为积木城堡的程序。

#include <iostream>
#include <fstream>
using namespace std;
short n;
short cheng[101][101];//城堡
short num[101];//每个城堡的积木数
bool height[101][10001];//每个城堡可能达到的高度
short hh[101];//每个城堡搭建过程中能达到的最大高度。
short maxh=0;

int main()
{
 //ifstream fin("city.in");
//ofstream fout("city.out");
FILE* fin,*fout;
if((fin=fopen("data2.in","r+"))==0)printf("fin fail");
if((fout=fopen("data2.out","w"))==0)printf("fout fail");
fscanf(fin,"%d",&n);
//fin>>n;
  short temp=0;
  for(int i=0;i<n;i++)
   {
          for(int j=0;;j++)
         {//fin>>temp;
          fscanf(fin,"%d",&temp);
          if(temp==-1)
          {
                num[i]=j;
               break;
           }
          else cheng[i][j]=temp;
          }
   }

for(int i=0;i<n;i++)
  for(int j=0;j<num[i];j++)
    {for(int k=hh[i];k>=0;k--)
    {
            if(k==0||height[i][k]>0)
            {
              height[i][k+cheng[i][j]]=1;
            }

     }
            hh[i]+=cheng[i][j];
 }

 int minone=100001;
 for(int i=0;i<n;i++)
 {
         if(hh[i]<minone)
         minone=hh[i];

         }
         bool flag=0;
for(int j=minone;j>=0;j--)
{
        flag=0;
        for(int i=0;i<n;i++)
        if(height[i][j]==0)
        {

         flag=1;
         break;
        }
        if(j==0||flag==0)
        {
        fprintf(fout,"%d",j);
           break;
        }
   }

   return 0;

}

在 RT-Thread 系统中,虽然没有对全局指针变量的命名制定强制性的规则,但为了保证代码的可读性、可维护性和一致性,通常遵循一定的命名规范。这些规范与 RT-Thread 的代码风格和 C 语言编程的一般惯例保持一致。 ### 全局指针变量命名规范 全局指针变量的命名通常采用小写字母加下划线的方式,以便与局部变量和函数名保持一致。对于表示特定功能或结构的指针,建议在名称中体现其用途或所指向的数据类型。例如: ```c rt_thread_t g_main_thread; // 全局指针变量,指向主线程控制块 ``` 在上述示例中,`g_` 前缀表示该变量全局变量,`main_thread` 表示其用途,这种命名方式有助于快速识别变量的作用域和用途[^1]。 对于指向系统对象(如线程、信号量、事件等)的全局指针,通常使用对象类型对应的类型名作为变量名的一部分,例如 `rt_thread_t` 类型的指针用于指向线程控制块 `struct rt_thread`,其命名应体现其指向对象的类型。 ### 常见命名习惯 - **前缀 `g_`**:表示全局变量,如 `g_system_state`。 - **后缀 `_ptr`**:表示指针类型,如 `event_ptr`。 - **使用对象类型命名**:如 `rt_thread_t` 类型的变量命名通常为 `thread_ptr` 或类似形式。 ### 示例代码 以下是一个符合命名规范的全局指针变量定义示例: ```c #include <rtthread.h> rt_thread_t g_scheduler_thread; // 全局指针变量,指向调度线程 int main(void) { g_scheduler_thread = rt_thread_find("tmain", 0); // 查找主线程 if (g_scheduler_thread != RT_NULL) { rt_kprintf("Main thread found.\n"); } return 0; } ``` 在上述代码中,`g_scheduler_thread` 是一个全局指针变量,其命名清晰地表达了它是一个全局变量,且指向一个线程对象。 ### 注意事项 - 在定义全局指针变量时,应尽量避免使用模糊不清的名称,如 `ptr` 或 `p`,而应使用能够表达变量用途的名称。 - 若指针变量仅在模块内部使用,建议使用 `static` 关键字限制其作用域,并在命名上体现其模块归属,例如 `static rt_thread_t scheduler_thread;`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值