在C,2D浮点数组中管理内存

时间:2019-02-19 12:34:51

标签: c memory-management

我对C非常缺乏经验,必须将其用于探索热传递的一门课程中。

我收到(0xC0000005)返回码的各种错误。我知道这是一种尝试访问内存的尝试,并且可能无法在某处正确分配内存,但是我无法弄清楚。

任何想法都需要改变吗?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main(){

    /* constant alpha squared, the area of the domain */
    const float alphSqrd     = 0.01;
    const float deltX, deltY = 0.0002;
    const float timeStep     = 0.0000009;
    const int   maxTimeSteps = 1000;

    int h, i, j;

    /* 2D Array of Temperature Values */
    float T [500][500];

    float dTdt;

    /* initialise temperature values */
    printf("Initialising 2D array...\n");

    for (i=0; i<500; i++){
        for (j=0; j<500; j++){
            if (150<=i && i<350 && 150<=j && j<350){
                T[i][j] = 50;
            } else {
                T[i][j] = 20;
            }
        }
    }

    printf("Updating values...\n");

    for (h=0; h<maxTimeSteps; h++){
        for (i=0; i<500; i++){
            for (j=0; j<500; j++){
                dTdt = alphSqrd*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(deltX*deltX))+((T[i][j+1]-2*T[i][j]+T[i][j-1])/(deltY*deltY)));
                T[i][j] = T[i][j] + dTdt * timeStep;
                printf("%f ",T[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

3 个答案:

答案 0 :(得分:3)

dTdt计算期间,您正在使用T[i-1][j]T[i-1][j]。如果i最大(0或500),则超出数组限制。 j也是如此。 因此,您将使用未初始化的内存。您需要将形式1循环到499,并根据要解决的问题来区别对待边界。

答案 1 :(得分:3)

尽管这不是您要描述的问题,但一个问题是您没有初始化deltX。代替这个

const float deltX, deltY = 0.0002;

您想要

const float deltX = 0.0002 , deltY = 0.0002;

除此之外,您还有超出范围的问题。如果您要访问索引i - 1i + 1,则无法在0个元素的数组上从499500循环。

如果我像这样调整循环,它将对我有用:

for (i = 1; i < 499; i++) {
        for (j = 1; j < 499; j++) {

答案 2 :(得分:0)

首先调整循环的最小值和最大值;

for (i=1; i<499; i++){
    for (j=1; j<499; j++){

您应该在printf()处添加注释行。 stdout需要花费大量时间。

for (h=0; h<maxTimeSteps; h++){
    for (i=1; i<499; i++){
        for (j=1; j<499; j++){
            dTdt = alphSqrd*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(deltX*deltX))+((T[i][j+1]-2*T[i][j]+T[i][j-1])/(deltY*deltY)));
            T[i][j] = T[i][j] + dTdt * timeStep;
            //printf("%f ",T[i][j]);
        }
        //printf("\n");
    }
}  

我在虚拟Linux上编译了这段代码,花了将近3秒钟。 enter image description here