PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   [C語言]小程式出錯,概念的問題--只要迴圈一多就容易出錯 (https://www.pcdvd.com.tw/showthread.php?t=708768)

hbkqoo 2007-04-04 12:44 AM

[C語言]小程式出錯,概念的問題--只要迴圈一多就容易出錯
 
大家晚安!

以下的程式碼只要main裡面的迴圈數一多,就會Access Violation
小弟因為不太熟悉C語言,麻煩各位先進幫忙找出問題給予指導。
先謝謝你們!




#define ChromosomeNumber 30
#define GeneNumber 10
int main()
{
int i;
int *CrossoverGene = malloc(sizeof(int)GeneNumber*ChromosomeNumber);
int *StartGene= malloc(sizeof(int)GeneNumber*ChromosomeNumber);
int *SelectGene= malloc(sizeof(int)GeneNumber);

for(i=0;i<5;i++)
{
Crossover(CrossoverGene, SelectGene, StartGene,ChromosomeNumber);
}
getchar();
return 0;

}

void Crossover(int *CrossoverGene, int *SelectGene, int *StartGene, int ChromosomeNumber)
{
for(count=0;count<GeneNumber;count++)
{
for(i=0;i<ChromosomeNumber;i++)
{
*(CrossoverGene+(count*ChromosomeNumber+i))=
StartGene[(SelectGene[count]*ChromosomeNumber+i)];
}
}
}

ouchman 2007-04-04 03:21 AM

StartGene[(SelectGene[count]*ChromosomeNumber+i)];

這行怪怪的,你SelectGene內容值沒初始,乘上ChromosomeNumber有可能會超過邊界

harrisonlin 2007-04-04 10:09 AM

代碼:
 *(CrossoverGene+(count*ChromosomeNumber+i))=...


推測存取 CrossoverGene 陣列超出範圍囉~

CrossoverGene 宣告時只有 int * GeneNumber 大小,在 32 位元的機器上,就是 4 * 10 = 40 bytes;但是你在上述這一行程式碼中, CrossoverGene 有可能會存取到 40 bytes 外的空間,當然會有 Access violation 囉!


所有的時間均為GMT +8。 現在的時間是12:02 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。