• Mingw下g++编译执行顺序错误


    今天写一个简单的线性表时,用Mingw中的g++编译、调试、运行时发现一个奇怪的现象:程序的执行顺序与实际编写顺序不一致。

    编译环境:代码编写  win7下   editplus + Mingw 4.3.3 + g++

    代码片段如下:

      1 //function: create a list 
      2 //time:2013-11-8 23:38
      3 //filename:list_01.cpp
      4 //author :alex
      5 #include <stdio.h>
      6 #define MAXSIZE 20 //存储空间初始大小
      7 #define OK 1 //success
      8 #define ERROR 0 // failed
      9 #define TRUE 1
     10 #define FALSE 0
     11 typedef int Status;// 返回函数结果状态
     12 typedef int ElemType;//int 型 ElemType
     13 //定义线性表的结构体
     14 typedef struct 
     15 {
     16  ElemType data[MAXSIZE];//data[20]
     17  int length;//线性表当前长度
     18 }SqList;
     19 //初始化链表0
     20 Status InitList(SqList *L)
     21 {
     22  L->length=0;//指定长度为0
     23  printf("初始化完成...
    ");
     24  return OK;
     25 }
     26 //打印出链表的内容
     27 Status PrintList(SqList *L)
     28 {
     29  if(L->length > 0)
     30  {
     31  printf("链表元素如下:
    ");
     32  for(int i=0;i < L->length;i++)
     33  printf("%d	",L->data[i]);
     34  return OK;
     35  }
     36  else
     37  {
     38  printf("L.length=%d",L->length);
     39  return ERROR;
     40  }
     41 }
     42 //取元素 O(1)
     43 Status GetElem(SqList L,int i,ElemType *e)
     44 {
     45  if(L.length==0 || i<1 || i>L.length)
     46  return ERROR;
     47  *e=L.data[i-1];//直接取值data[i-1]
     48  return OK;
     49 }
     50 //插入数据 为i第几个元素位置,从1开始 O(n)
     51 Status ListInsert(SqList *L,int i,ElemType e)
     52 {
     53  int k;
     54  if(L->length==MAXSIZE) //判断满否
     55  return ERROR;
     56  if(i<1 || i> L->length+1) //超出范围
     57  return ERROR;
     58  if(i< L->length)
     59  {
     60  for(k=L->length-1;k>=i-1;k--)
     61  //将要插入位置后的数据元素向后移动一位
     62  L->data[k+1]=L->data[k];
     63  }
     64  L->data[i-1]=e;//插入新元素
     65  L->length++; //线性表长度+1
     66  return OK;
     67 }
     68 //删除数据 删除第i个位置元素,用e返回其值 O(n)
     69 Status ListDelete(SqList *L,int i,ElemType *e)
     70 {
     71  int k;
     72  if(L->length==0)//线性表为空
     73  return ERROR;
     74  if(i<1 || i> L->length)//删除位置超出
     75  return ERROR;
     76  *e=L->data[i-1]; //i位置元素取出
     77  if(i< L->length) //位置适当
     78  { 
     79  for(k=i;k < L->length;k++)
     80  L->data[k-1]==L->data[k];
     81  }
     82  L->length--;
     83  return OK;
     84 }
     85 int main(int argc, char *argv[])
     86 {
     87  int i,j,k;
     88  printf("This is a list_demo:
    ");
     89  SqList list;
     90  //初始化链表list长度为5
     91  InitList(&list);
     92  //数组长度与链表长度的关系???
     93  //回显
     94  printf("list.length=%d 
    ",list.length);
     95  //插入元素
     96 
     97  printf("插入5个元素
    ");
     98  /*
     99  for(i=0;i<5;i++)
    100  {
    101  scanf("%d",&k);
    102  ListInsert(&list,i+1,k);
    103  }
    104  */
    105  i=0; 
    106  while (i<5)
    107  {
    108  scanf("%d",&k);
    109  ListInsert(&list,i+1,k);
    110  i++;
    111  }
    112  PrintList(&list);
    113  return 0;
    114 }
    View Code

    截图输出    需要先输入之后才执行main函数开始部分,奇怪哉???

    然而在gdb调试输出时,却又是正确的,见下:

    11

    问题是怎样产生的尚不明确,猜测与Mingw下g++编译器有关,尚待调查中。。。。

  • 相关阅读:
    [leetcode] Bulls and Cows
    Win7 系统所有应用颜色调整
    一道题反映Java的类初始化过程
    翻转二叉树(深搜-先序遍历-交换Node)
    在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
    一道随机函数题:由rand5()生成rand7()
    求一条直线通过的最大点数
    菜根谭#236
    菜根谭#235
    菜根谭#234
  • 原文地址:https://www.cnblogs.com/vvwang/p/3416164.html
Copyright © 2020-2023  润新知