2014-01-13 22 views
-3

我有一個非常奇怪的程序崩潰問題。
我有兩個相同的代碼「代碼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()時,程序崩潰了。

我沒有收到任何編譯錯誤/警告。

當我使用「代碼A」編譯和運行程序時, 程序工作正常,但當使用「代碼B」編譯完成時,即更改變量聲明序列時,程序崩潰。

我試圖調試該問題,發現一些內存損壞的問題,但無法找到其根本原因。

另外這個崩潰是不統一的,相同的程序在一個系統上工作正常,並在另一個系統上崩潰。與2個不同登錄系統的情況也是如此。程序使用其他用戶進行編譯時使用一次登錄並崩潰。

這是字節對齊問題嗎?如果是的話,任何人都可以詳細解釋。

,我所面臨的問題,但 它工作正常的HP不間斷H系列系統我正在運行的HP不間斷G系列系統程序。
編譯用在G系列系統是「NMC」和H系列系統是「CCOMP」

+0

只是一個猜測:你在函數中用'l_reply_c'做什麼?我假設問題不是聲明,而是在「數據處理邏輯」中。你可以發佈左邊的代碼嗎? – eckes

+0

我們需要代碼。並且需要一個小例子來演示這個問題(www.sscce.org) –

+1

毫無疑問,你的代碼正在破壞一些數據,但除非你顯示它,否則我們不能更具體。 –

回答

1

,如果你有像「函數strncpy(l_TCPIP1_ca,‘測試代碼’,40);」你會得到一個未定義的堆棧溢出。現在它取決於底層操作系統和編譯器,程序如何表現/崩潰/損壞數據。

您EDITH:

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

,如果我輸入 「AB」 你得到你的溢出。

+0

我已經使用strcpy(l_ProcessName_ca,l_ProcessName1_ca); –

+2

實際上,單個字符足以在單字符緩衝區之後寫入'\ 0',但根據對齊大小,對齊可能會使溢出無害,直到您經過1,3,7等字符。 –

相關問題