我遇到了一个非常奇怪的程序崩溃问题 我有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”
答案 0 :(得分:1)
如果你有像“strncpy(l_TCPIP1_ca,”test“,40)这样的代码;”你得到一个未定义的堆栈溢出。现在它取决于底层操作系统和编译器,程序如何表现/崩溃/破坏数据。
你的EDITH:
char l_reply_c = '\0';
scanf("%s",&l_reply_c);
如果我输入“ab”,你就会溢出。