调试初学者C崩溃,寻找发现错误的替代逻辑

调试初学者C崩溃,寻找发现错误的替代逻辑,c,string,debugging,loops,null,C,String,Debugging,Loops,Null,我在做一个项目的研究,这个项目(大部分)是有效的,而且。。。我在终点线遇到了一个导致系统完全崩溃的bug。经过打印筛选以确定漏洞,我有理由相信我已经在它的藏身处找到了小精灵,但我想不出任何bug喷雾解决方案 你们当中有人对解决这个难题有什么想法或建议吗?我认为一双新鲜的眼睛会创造奇迹!我非常感谢您的时间,我非常确定最后这真的很简单!>_ 线路 realloc(Main_Array, sizeof(int)); 这是错误的。返回一个指针,该指针可能指向新内存,因此当您在下一行取消引用Main\u

我在做一个项目的研究,这个项目(大部分)是有效的,而且。。。我在终点线遇到了一个导致系统完全崩溃的bug。经过打印筛选以确定漏洞,我有理由相信我已经在它的藏身处找到了小精灵,但我想不出任何bug喷雾解决方案

你们当中有人对解决这个难题有什么想法或建议吗?我认为一双新鲜的眼睛会创造奇迹!我非常感谢您的时间,我非常确定最后这真的很简单!>_ 线路

realloc(Main_Array, sizeof(int));
这是错误的。返回一个指针,该指针可能指向新内存,因此当您在下一行取消引用
Main\u数组时,您可能正在访问已释放的内存。此外,您需要传递更新的内存缓冲区的完整大小,而不仅仅是增量

您可以通过将
动态_Fitting
更改为

int Dynamic_Fitting(int** Main_Array , int Incomming_int , int Main_Size)
{
    int* temp = realloc(Main_Array, (Main_Size +1) * sizeof(int));
    if (temp == NULL) {
        return -1; /* caller must handle oom error */
    }
    *Main_Array = temp;
    (*Main_Array)[Main_Size] = Incomming_int;
    printf("Dynamic fitting check: %i put into Main_Array[%i]\n\n", Incomming_int, Main_Size);
    return Main_Size+1;
}
把它叫做

Main_Size = Dynamic_Fitting(&Main_Array, ....);
if (Main_Size == -1) {
    /* out of memory.  cleanup and exit program */
}
线路

realloc(Main_Array, sizeof(int));
这是错误的。返回一个指针,该指针可能指向新内存,因此当您在下一行取消引用
Main\u数组时,您可能正在访问已释放的内存。此外,您需要传递更新的内存缓冲区的完整大小,而不仅仅是增量

您可以通过将
动态_Fitting
更改为

int Dynamic_Fitting(int** Main_Array , int Incomming_int , int Main_Size)
{
    int* temp = realloc(Main_Array, (Main_Size +1) * sizeof(int));
    if (temp == NULL) {
        return -1; /* caller must handle oom error */
    }
    *Main_Array = temp;
    (*Main_Array)[Main_Size] = Incomming_int;
    printf("Dynamic fitting check: %i put into Main_Array[%i]\n\n", Incomming_int, Main_Size);
    return Main_Size+1;
}
把它叫做

Main_Size = Dynamic_Fitting(&Main_Array, ....);
if (Main_Size == -1) {
    /* out of memory.  cleanup and exit program */
}

我想这是问题之一。 您共享了一个非常糟糕的代码,分析所有内容都是一项任务。。。查看以下问题是否解决了您的问题

int Input_String(char str[])
{
   printf("\nPlease input a string of numbers.\n");
   printf("Tap enter again once finnished: \n\n");
   int i=0;
   while ((str[i] = getchar()) != '\n') //  HERE if user enters more than array Size it will fail... with exception
      i++;
   str[i+1]='\0';
   return i; /// THIS is wrong.. following if will never execute..

   if (i>MAX_SIZE-1 || i<MIN_SIZE)
      {
         printf("Your sumbition dosn't fit the size criteria.\n");
         printf("Please reenter:\n\n");
         Input_String(str);
      }
}
int输入字符串(char str[]
{
printf(“\n请输入一串数字。\n”);
printf(“再次点击回车键:\n\n”);
int i=0;
while((str[i]=getchar())!='\n')//这里,如果用户输入的数组大小超过,它将失败…异常
i++;
str[i+1]='\0';
return i;///这是错误的..后面的if将永远不会执行。。

如果(i>MAX|u SIZE-1 | iMAX|u SIZE-1 | i我想这就是问题之一。 您共享了一个非常糟糕的代码,分析所有内容都是一项任务…看看下面的问题是否解决了您的问题

int Input_String(char str[])
{
   printf("\nPlease input a string of numbers.\n");
   printf("Tap enter again once finnished: \n\n");
   int i=0;
   while ((str[i] = getchar()) != '\n') //  HERE if user enters more than array Size it will fail... with exception
      i++;
   str[i+1]='\0';
   return i; /// THIS is wrong.. following if will never execute..

   if (i>MAX_SIZE-1 || i<MIN_SIZE)
      {
         printf("Your sumbition dosn't fit the size criteria.\n");
         printf("Please reenter:\n\n");
         Input_String(str);
      }
}
int输入字符串(char str[]
{
printf(“\n请输入一串数字。\n”);
printf(“再次点击回车键:\n\n”);
int i=0;
while((str[i]=getchar())!='\n')//这里,如果用户输入的数组大小超过,它将失败…异常
i++;
str[i+1]='\0';
return i;///这是错误的..后面的if将永远不会执行。。

如果(i>MAX_SIZE-1 | | iMAX_SIZE-1 | | | i1。如果使用花盒,至少要使用
/***/
,因为
/////code>很糟糕。2.
realloc(Main_数组,sizeof(int))
没有任何好处(请检查文档以查看
realloc()
出于某种原因返回指针…-还要考虑为什么需要一个大小参数);3.字母大写表示字母大写,特别是带有下划线的字母大写,很难看,请在字母分数下选择一个
camelCaps
。从现在起,我将使用/***/并研究您提到的命名约定!关于realloc的更多研究将在将来进行,我认为我已经从realloc()中充分理解了它网络上的解释。1.如果你使用花盒,至少要使用
/***/
,因为
/////code>很糟糕。2.
realloc(Main_数组,sizeof(int));
没有任何用处(检查文档以查看
realloc()
出于某种原因返回指针…-还要考虑为什么它需要一个大小参数);3.字母大写表示字母大写,特别是带有下划线的字母大写,很难看,请在字母分数下选择一个
camelCaps
。从现在起,我将使用/***/并研究您提到的命名约定!关于realloc的更多研究将在将来进行,我认为我已经从realloc()中充分理解了它net.Man上的解释让我大吃一惊,我确信我有realloc down>:我对您的新代码部分进行了测试,对其进行了一些修改,使其适应,并且它不再导致我的程序崩溃,这是一个非常了不起的胜利!Main仍然比正常值高+1,并为最终的Main_数组提供了额外的0值[主要尺寸]就像以前一样,但现在问题更容易处理!至于Valigrid,我从未听说过,但当我发现它是什么时,我非常激动,肯定会在未来使用它,这让我感到惊讶,我确信我有realloc down>:我对你的新代码部分进行了测试,对它进行了一些修改以适应,没有更长的时间会导致我的程序崩溃,这是一个非常棒的胜利!Main仍然比正常值高+1,并为最终的Main_数组[Main_Size]提供额外的0值就像以前一样,但现在问题更容易处理!至于Valigrid,我从未听说过它,但当我发现它是什么时,我非常激动,肯定会在将来使用它。我将在研究Simonc的答案后尝试使用它,以进行比较和对比。谢谢!编辑:该程序与即使输入在正常范围内,大小也会发生冲突。但是,它确实给了我一些关于一个额外错误的更多信息,这个错误现在被确认为一个独立的问题-主数组的末尾增加了一个额外的值。在我研究了Simonc的答案之后,我将尝试使用它进行比较和对比。谢谢!编辑:pr即使输入在正常范围内,Gram也会因大小冲突而改变。然而,它确实给了我更多关于一个额外bug的信息,这个bug现在被确认为一个独立的问题——主阵列在其末端增加了一个额外的值