变量声明序列更改时程序崩溃

时间:2014-01-13 10:37:44

标签: c memory-alignment

我遇到了一个非常奇怪的程序崩溃问题 我有2个相同的代码“代码A”和“代码B”如下 在“代码B”中,我刚刚更改了变量声明的顺序。

/******** Code A ******/
void MyFunction(char * ONOFF_Flag)
{
    short l_subchoice_s ;
    char  l_subchoice_ca[1] = {'\0'};
    char  l_ProcessName_ca[30];
    char  l_reply_c = '\0';
    char  l_Type_c = 'P';
    char  l_ProcessName1_ca[30];
    char  l_TCPIP_ca[30];
    char  l_TCPIP1_ca[30];

    /*
    Data Processing Logic
    */
}

/******** Code B ******/
void MyFunction(char * ONOFF_Flag)
{
    char  l_reply_c = '\0';
    short l_subchoice_s ;
    char  l_subchoice_ca[1] = {'\0'};
    char  l_ProcessName_ca[30];
    char  l_Type_c = 'P';
    char  l_ProcessName1_ca[30];
    char  l_TCPIP_ca[30];
    char  l_TCPIP1_ca[30];
    /*
    Data Processing Logic
    */
}

/ *数据处理逻辑如下* /

printf("I"); /* CLSCR */
printf("\t\t  ONLINE PARAMETER READ MENU");
printf("\n\t\t  ==================================\n");
printf("\n\t\t  1. Profile %s for one Server",ONOFF_Flag);
printf("\n\t\t  2. Profile %s for ALL Servers",ONOFF_Flag);
printf("\n\t\t  3. Return to Previous Menu");
printf("\n\n\t\t  Enter choice  : ");
scanf("%s",&l_subchoice_ca);

l_subchoice_s = (short) atoi(l_subchoice_ca);

switch(l_subchoice_s)
{
    case 1:
      AllorOneFlag ='O';
      printf("\n\n\n\t\tEnter server name  $");
      scanf("%s",&l_ProcessName_ca);

      sprintf(l_ProcessName1_ca,"$%s",l_ProcessName_ca);
      memset(l_ProcessName_ca,'\0',strlen(l_ProcessName_ca));
      strcpy(l_ProcessName_ca,l_ProcessName1_ca);
      printf("\n\tDo you wish to do New Profile on/off the (Y/N)..?      :");
      scanf("%s",&l_reply_c);

      while  (l_reply_c != 'y' && l_reply_c != 'Y' &&l_reply_c != 'n' && l_reply_c != 'N' )
      {
        printf("\n\t Invalid Choice; Press (Y/N)              :");
        scanf("%s",&l_reply_c);
      }

        if(l_reply_c == 'y' || l_reply_c == 'Y' )
        {
          UpdateforOne(g_SystemNo_s, l_ProcessName_ca,l_Type_c);
        }
        break;

    case 2:
       AllorOneFlag ='A';
       printf("\n\tDo you wish to update parameter of ALL Servers (Y/N)..?      :");
       scanf("%s",&l_reply_c);
       while  (l_reply_c != 'y' && l_reply_c != 'Y' &&l_reply_c != 'n' && l_reply_c != 'N' )
       {
         printf("\n\t    Invalid Choice; Press (Y/N)              :");
         scanf("%s",&l_reply_c);
       }
       if(l_reply_c == 'y' || l_reply_c == 'Y' )
       {
         UpdateforAll(l_Type_c);
       }
        break;

    case 4:
       printf("I"); /* CLSCR */
       break;

    default:
        printf("\n\n\n\tThis is not a valid choice ");
}

此代码在我们的服务器上运行了很长时间,最近我需要修改它的一些新要求。当我尝试添加函数Myfunction(),它是另一个类似函数的副本时,程序崩溃了。

我也没有收到任何编译错误/警告。

当我使用“Code A”编译并运行程序时, 程序工作正常但是当使用“代码B”完成编译,即更改变量声明序列时,程序崩溃。

我尝试调试此问题并发现了一些内存损坏问题,但无法找到此问题的根本原因。

此崩溃也不统一,同一程序在一个系统上正常工作,并在另一个系统上崩溃。具有2个不同登录的系统的情况也是如此。当使用其他用户编译时,程序只能使用一次登录和崩溃。

这是字节对齐问题吗?如果是,那么任何人都可以详细解释。

我正在HP不间断G系列系统上运行该程序,但我遇到了这个问题 它在HP不间断H系列系统上运行良好 G系列上使用的编译器是“nmc”,H系列上的编译器是“ccomp”

1 个答案:

答案 0 :(得分:1)

如果你有像“strncpy(l_TCPIP1_ca,”test“,40)这样的代码;”你得到一个未定义的堆栈溢出。现在它取决于底层操作系统和编译器,程序如何表现/崩溃/破坏数据。

你的EDITH:

char  l_reply_c = '\0';
scanf("%s",&l_reply_c);

如果我输入“ab”,你就会溢出。