奇怪的分段错误

Posted

技术标签:

【中文标题】奇怪的分段错误【英文标题】:Strange segmentation fault 【发布时间】:2012-08-18 17:03:22 【问题描述】:

我定义了一个随机函数 (int random(int sup, int seed)),它返回一个介于 0 和 sup-1 之间的值。 我已经定义了一个结构点,其中 pos_parents 和 population 是二维数组。 交换函数交换 v 数组的元素,它是一个“索引”数组。所有这些都是为了从总体成员中将 par_n 成员分类为 pos_parents 而不对同一成员进行两次排序。

这会导致分段错误。

如果我将population[v[r]][j] 中的变量r 替换为显式值,那么它就可以正常工作。这怎么可能?随机函数我试过了,好像没有问题。

此外,当发生分段错误时,printf 甚至不会在第一个循环中激活。

point population[pop_size][array_size];
point pos_parents[4*par_n][array_size];
int v[pop_size];

for (i=0; i<4*par_n;i++)
    v[i]=i;

for(t=0;t<time_limit;t++) //The cycle of life

    for(i=0;i<4*par_n;i++)
    
        r=random(pop_size-i,i);
        printf("%d\t",r);

        for(j=0;j<array_size;j++)
        
            pos_parents[i][j]=population[v[r]][j];
        
        swap(&(v[r]),&(v[pop_size-1-i]));
    

执行i时键入3(路由位置-数组大小)、8(pop_size)、1(时间限制)、1(par_n)

这是整个代码(不到150行),总是插入1到time_limit,因为我还没有完成循环。 https://docs.google.com/open?id=0ByylOngTmkJddVZqbGs1cS1IZkE

附: 我正在尝试编写一个进化算法,用于路线优化

【问题讨论】:

遇到分段错误或其他崩溃时,您应该做的第一件事是在调试器中运行您的程序。这将帮助您找到崩溃的位置,并让您检查变量以帮助您了解可能导致崩溃的原因。 在您的情况下,您可能正在访问数组之一之外的索引。 对。在上面的代码中,我猜v[] 的大小小于4*par_n。所以第一个 for 循环是覆盖堆栈帧中的一些重要内容。 除了@JoachimPileborg 的调试器建议之外,您还没有发布足够的代码来确定可能发生的情况。几乎可以肯定您正在触摸一个不存在的数组位置,但没有声明(或者更好的是一个可运行的示例),我们无能为力。 如果您有par_n 成员,为什么要使用4 * par_n 作为数组的上限?这可能是你麻烦的主要部分。 printf() 通常在打印换行符或打印缓冲区已满之前不会向屏幕发送任何内容。对于调试,要么打印到stderr,要么打印一个换行符(并且可以选择使用fflush(0) 刷新输出。我担心你每次都将种子提供给随机函数。其余的,请考虑提供@987654322 @ — 重现问题的简短、独立、正确(编译)示例。 【参考方案1】:

v[i] = i; 的循环从04 * par_n,但v 是一个大小为pop_size 的数组。这看起来像是一个等待罢工的越界问题。对于r = random(pop_size - i, i); 中的计数器i 也是如此,因为i 用于v[i]

【讨论】:

致乔纳森和克雷克。 random 函数中的 i 不会令人不安,pos_size-i 降低了 random 在其中工作的范围,这样就不会再次使用所取的数字。此外,我将 i 提供给种子,因为在我插入此索引之前,随机给出相同的值之前我遇到了问题

以上是关于奇怪的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的分段错误

带有clang的C大数组中的奇怪分段错误

在 C++ 中嵌入 python:奇怪的分段错误

运行 zend_hash_find() 时出现分段错误

将 ROS PointCloud2 消息转换为 PCL PointCloud 后出现奇怪的分段错误

为啥这个非常简单的构造函数会导致段错误?