奇怪的分段错误
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;
的循环从0
到4 * par_n
,但v
是一个大小为pop_size
的数组。这看起来像是一个等待罢工的越界问题。对于r = random(pop_size - i, i);
中的计数器i
也是如此,因为i
用于v[i]
。
【讨论】:
致乔纳森和克雷克。 random 函数中的 i 不会令人不安,pos_size-i 降低了 random 在其中工作的范围,这样就不会再次使用所取的数字。此外,我将 i 提供给种子,因为在我插入此索引之前,随机给出相同的值之前我遇到了问题以上是关于奇怪的分段错误的主要内容,如果未能解决你的问题,请参考以下文章