gpt4 book ai didi

c - 更改变量声明顺序时程序崩溃

转载 作者:行者123 更新时间:2023-11-30 21:03:47 25 4
gpt4 key购买 nike

我遇到了一个非常奇怪的程序崩溃问题。
我有 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()(它是另一个类似函数的副本)时,程序崩溃了。

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

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

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

此外,这种崩溃并不统一,相同的程序在一个系统上运行良好,但在另一个系统上崩溃了。具有 2 个不同登录名的系统上的情况也是如此。程序可以在一次登录下运行,但在使用另一用户编译时会崩溃。

这是字节对齐问题吗?如果是的话谁能详细解释一下。

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

最佳答案

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

你的伊迪丝:

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

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

关于c - 更改变量声明顺序时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21089173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com