为什么这个阵列不够大?

时间:2012-01-08 05:53:53

标签: c memory

我一直在运行这种随机游走模拟一段时间,我不断从Xcode收到错误EXC_BAD_ACCESS。它虽然打印了大部分模拟。

我认为由于某些原因内存不足但我不确定原因。

如果我走向数组的末尾,我编辑它,所以我不会在边缘的100个空格内(通过将变量步骤编辑为步骤-100)。这有效,但我想知道发生了什么。

任何帮助将不胜感激。

double** places;  
places = (double**) malloc(steps*sizeof(double*));  
for (int i = 0; i < steps; i++)places[i] = (double*) malloc(2*sizeof(double));  

for (i = 0; i< steps/*, exit*/; i++) {
    // Find the angle of movement 
    angle = getRand()*360; 
    // Take a step
    xPos+= STEP*cos(angle);
    yPos+= STEP*sin(angle);
    //Write Step to array
    places[i][1] = xPos;
    places[i][2] = yPos;
    //Write Step to File
    fprintf(ff, "%d %lf %lf\n",i,xPos,yPos);
}

5 个答案:

答案 0 :(得分:7)

数组索引从零开始。

你的意思是写这个吗?

    places[i][0] = xPos; //Zeroth element is considered the first element
    places[i][1] = yPos; //Second element

答案 1 :(得分:0)

您已经分配了一个适当大小的数组(步骤x 2),但是您在子数组上写入错误的偏移量。它们应该是[0]和[1],而不是[1]和[2]。

[2]实际上是 3rd 数组元素,所以你要在子数组的边界之外写字。

答案 2 :(得分:0)

内部数组(位于places[i])有两个元素的空间 - 由[0][1]索引,因为数组索引通常在C中从零开始。在这里,你将它们编入索引使用[1][2]。您需要使用[0][1],或为三个元素分配足够的空间(并浪费为[0]分配的空间)。

答案 3 :(得分:0)

索引从0开始。

这应该是:

places[i][0] = xPos;
places[i][1] = yPos;

答案 4 :(得分:0)

你是一个人。 C中的数组是从零开始的,因此第一个元素位于位置0.您需要将赋值更改为places数组,如下所示:

// Write Step to array
places[i][0] = xPos;
places[i][1] = yPos;