C 什么';是什么导致此程序中出现分段错误?

C 什么';是什么导致此程序中出现分段错误?,c,segmentation-fault,stack-overflow,C,Segmentation Fault,Stack Overflow,请通过在我的程序中调用以下函数来帮助我解决此SIGSEGV错误: int* calculateFitness(int** population, int** townDistancesMatrix, int chromoSize){ int sum = 0; static int* Fitnesses; Fitnesses = malloc(sizeof(int)*chromoSize); for(int i=0; i<chromoSize; i++){

请通过在我的程序中调用以下函数来帮助我解决此SIGSEGV错误:

int* calculateFitness(int** population, int** townDistancesMatrix, int chromoSize){
    int sum = 0;
    static int* Fitnesses;
    Fitnesses = malloc(sizeof(int)*chromoSize); 
    for(int i=0; i<chromoSize; i++){
        int indexOne = 0;
        int indexTwo = 0;
        for(int j=0; j<chromoSize-1; j++){
            indexOne = population[i][j];
            indexTwo = population[i][j+1];
            //printf("\n%d %d",indexOne-1,indexTwo-1);
            sum += townDistancesMatrix[indexOne-1][indexTwo-1];
        }
        indexOne = population[i][0];
        sum += townDistancesMatrix[indexTwo-1][indexOne-1];
        Fitnesses[i] = sum;
        sum = 0;
    }
    return Fitnesses;
}
我搜索了这个错误的部分,比如“仍然可以到达”,这似乎不是我需要注意的事情,但即使在搜索了第一部分之后,我也不确定它们的含义。我做错了什么?如果它真的是stackoverflow,除了递归之外,还有什么其他原因导致stackoverflow

int main(){
  int* population[POPSIZE];

for(int i=0;i
及


for(int i=0;i首次调用该函数后,内存将泄漏(除非您将分配给
Fitnesses
的指针释放到其他地方).为什么变量
Fitnesses
甚至是
静态的
?原因是什么?至于您的问题,您显示的代码中的行
155
161
?当崩溃发生时,您是否检查了所有相关变量的值以确定它们是否有效?我们需要帮助您的原因是什么?关于
static
变量,当您返回指向堆分配内存的指针时不需要该变量。您返回的是变量的值,而不是指向变量本身的指针。我们不需要整个程序(如前所述)创建一个来向我们展示。它还可以帮助您了解自己的问题所在。Valgrind的输出中有一个很大的提示:“使用未初始化的值”。似乎您正在使用未初始化的变量,这意味着它们的值将是不确定的(而且似乎是随机的)。取消对未初始化指针的引用将导致和您一样的崩溃。不,只需在前面提到的行上添加注释即可将它们标记出来。首次调用函数后,您将出现内存泄漏(除非您将分配给
Fitnesses
的指针释放到其他位置).为什么变量
Fitnesses
甚至是
静态的
?原因是什么?至于您的问题,您显示的代码中的行
155
161
?当崩溃发生时,您是否检查了所有相关变量的值以确定它们是否有效?我们需要帮助您的原因是什么?关于
static
变量,当您返回指向堆分配内存的指针时不需要该变量。您返回的是变量的值,而不是指向变量本身的指针。我们不需要整个程序(如前所述)创建一个来向我们展示。它还可以帮助您了解自己的问题所在。Valgrind的输出中有一个很大的提示:“使用未初始化的值”。似乎您正在使用未初始化的变量,这意味着它们的值将是不确定的(而且似乎是随机的)。取消对未初始化指针的引用将导致和您一样的崩溃。不,只需在提到的行上添加注释即可将它们标记出来。它现在已修复并正在工作!但我不知道为什么尽管POPSIZE 50工作正常,但POPSIZE 1000提供了
双重免费或损坏(!prev)中止(内核转储)
。我不知道这个错误,我必须搜索它,但是你有什么猜测吗?非常感谢你的帮助。@m-J你有核心转储,所以只要使用调试器给它exe和核心,它就会显示它发生的位置,或者我想如果你在valgrind下运行,当POPSIZE如果1000时,它也会提示你的问题在哪里。你是我给你发了一个无效的免费信号,你把它删除了吗?它现在已经修好了,正在工作!但我不知道为什么尽管POPSIZE 50工作正常,POPSIZE 1000提供了
双重免费或损坏(!prev)中止(内核转储)
。我不知道这个错误,我必须搜索它,但是你有什么猜测吗?非常感谢你的帮助。@m-J你有核心转储,所以只要使用调试器给它exe和核心,它就会显示它发生的位置,或者我想如果你在valgrind下运行,当POPSIZE如果1000时,它也会提示你的问题在哪里。你是我给你发了个信号,你把它拿走了吗?
int main(){
  int* population[POPSIZE];
for(int i=0; i<chromoSize; i++){
    int indexOne = 0;
    int indexTwo = 0;
    for(int j=0; j<chromoSize-1; j++){
        indexOne = population[i][j];
        indexTwo = population[i][j+1];