代码不起作用。但是在调试时会

用户名

我在这里需要一些帮助,但通过搜索找不到任何相关的内容。

因此,我正在编写一个C程序,并且发生了一些奇怪的事情。我的程序在正常运行时会崩溃,但是在调试时,它可以正常运行。我不知道发生了什么事。

这是一项作业,预定在星期三进行,所以我有点害怕。

(如果有帮助,我正在使用CodeBlocks IDE。)

编辑:很抱歉没有从一开始就发布此消息,我认为问题可能出在我使用调试器错误或必须更改调试器设置(如果可能的话)。这是造成问题的接缝功能:

double **makeMatrix(struct graph *head, char **nodes)
{
    double **tmpMatrix=NULL;
    int i=0, j=0;
    struct graph *tmp=NULL;


    if(nodes==NULL || head==NULL)
        return NULL;

    for(i=0; nodes[i] != NULL; i++);

    tmpMatrix=calloc(i+1, sizeof(double*));

    if(NULL==tmpMatrix)
    {
        printf("No Memory!");
        return NULL;
    }

    for(j=0; j<i; j++)
    {
        tmpMatrix[j]=calloc(i+1, sizeof(double*));

        if(NULL==tmpMatrix[j])
        {
            printf("No Memory!");
            return NULL;
        }
        tmpMatrix[j][i] = -INF;
    }

    for(i=0; tmpMatrix[i] != NULL; i++)
    {
        for(j=0; tmpMatrix[i][j] != -INF; j++)
        {
            tmpMatrix[i][j] = INF;
        }
    }

    for(tmp=head; tmp->fromNode >=0; tmp= tmp->next)
    {
        tmpMatrix[tmp->fromNode][tmp->toNode] = tmp->length;
        printf("%f\n", tmpMatrix[tmp->fromNode][tmp->toNode] );
    }

    return tmpMatrix;
}

该作业是关于编写一个程序,该程序能够读取节点和图形以计算短路路径。在哪里给出了Dijkstra算法来解决这个问题。这就是为什么我们必须创建一个矩阵来存储边的长度的原因。

另外,使用调试器,我正在逐步执行它。

uesp

根据未显示的所有代码和输入,我看到一些问题或潜在问题:

  1. 该行:

    tmpMatrix[j]=calloc(i+1, sizeof(double*));
    

    应该:

    tmpMatrix[j]=calloc(i+1, sizeof(double));
    

    如果sizeof(double*) == 8您可能会没事,但最好是正确的

  2. 在第一个for循环中,您似乎正在计算nodes数组的大小我不了解这种情况下节点的用法,因为在函数的其他地方未使用过节点。更好的功能签名是传递所需数组的大小。确保nodes已正确NULL终止,否则会遇到问题。我还将添加另一个变量以使数组大小明确,因为i稍后您将重复使用,例如:

    int arraySize = 0;
    ...
    for (i = 0; nodes[i] != NULL; ++i);
    arraySize = i;
    tmpMatrix = calloc(arraySize + 1, sizeof(double*));
    
  3. 对于设置的值tmpMatrix,以INF它会更好地使用显式数组索引,如:

    for (i = 0; i < arraySize; ++i)
    {
        for (j = 0; j < arraySize; ++j)
        {
            tmpMatrix[i][j] = INF;
        }
    }
    

    这样可以使您的工作更加清晰,并且不易出错。

  4. 您应该NULL在上一个循环中显式检查指针:

    for (tmp = head; tmp->fromNode >= 0; tmp = tmp->next)
    

    如果链表设置不正确,则tmp可能会变成链表,NULL并且您将取消引用它,从而导致未定义的行为。只需在循环中添加一个检查,如:

    for (tmp = head; tmp != NULL && tmp->fromNode >= 0; tmp = tmp->next)
    
  5. 您应该tmpMatrix在上一个循环中检查有效的数组索引

    tmpMatrix[tmp->fromNode][tmp->toNode] = tmp->length;
    

    如果tmp->fromNode或是tmp->toNode无效的数组索引,则会使数组上溢/下溢并导致UB。即使您“知道”这些值应该是正确的,以防万一,添加检查也要安全得多:

    if (tmp->fromNode >= 0 && tmp->fromNode < arraySize &&
        tmp->toNode   >= 0 && tmp->toNode   < arraySize) 
    {
       ...
    }
    

其中许多要点属于“防御性编程”类别。是的,nodes而且head应该是NULL终止,有正确的指标,但也许有另一种错误的地方,他们还没有,或者收到无效的输入,或流浪宇宙射线中的存储单元翻转了一下。通过更加仔细地检查您的输入,可以防止UB发生并像您所经历的那样随机崩溃。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么console.log在JSC环境中不起作用,但是在Safari的调试控制台中起作用

代码可以在控制台上正常运行,但是在通过浏览器扩展注入时会给出错误(在chrome中不起作用,而在Firefox中不起作用)

Visual Studio代码:从终端推送到git可以使用,但是在使用用户界面时不起作用

将.begin()作为参数传递时,我的代码不起作用,但是在将.begin()转换为迭代器后,我的代码起作用

为什么使用cxf-xjc-plugin从xsd生成代码(java)在jdk 11(amazon)上不起作用,但是在Java 8上却起作用

Eslint在VScode中不起作用,但是在终端中起作用

我的反应状态在函数中不起作用,但是在呈现时起作用

getUserMedia()在普通Chrome中不起作用,但是在启动pwa-chrome时起作用

内部联接在PHP中不起作用,但是在phpMyAdmin SQL中起作用

当我尝试暂停并在jsFiddle中播放时,我的代码可以工作,但是在我的html页面中不起作用

SharpScript .ss文件可用于连接到数据库,但是在提供给本地Web浏览器时,相同的代码不起作用?

为什么此功能不起作用,但是在Eclipse中却不显示错误?

bs4:“ soup.title.string”在IDLE上不起作用,但是在终端上

ForEach在mongodb上不起作用,但是在本地数组声明中可以正常工作

NASM教程使用int 80h,但是在Windows上不起作用

在php中执行sql查询不起作用,但是在phpmyadmin中执行查询

Python脚本在crontab中不起作用,但是在没有

我想做样式表,但是在PHP中不起作用

在python2中可以,但是在python3中不起作用

为什么此UPDATE预处理语句不起作用,但是在SQL db中使用时起作用

更新按钮的经过aria检查的属性,该属性在Chrome上不起作用,但是在Firefox上起作用

我试过调试这段代码,但它似乎不起作用

本机代码调试在Android Studio 3中不起作用

vs代码源映射的Angular CLI调试不起作用

函数 vs if 语句:函数不起作用,但函数中的代码在函数外部时会起作用?

为什么这在纸上起作用,但是逻辑在代码上不起作用

Laravel 4分页不起作用链接可以,但是在每个页面中显示所有结果

为什么实际的鼠标单击不起作用,但是在JS控制台中执行.click()却可以呢?

'.contains'在android手机中不起作用,但是在网页中可以正常工作