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

问题描述 投票:0回答:3

我对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;
}
c memory-management
3个回答
3
投票

虽然这不是你所描述的问题,但一个问题是你没有初始化deltX。而不是这个

const float deltX, deltY = 0.0002;

你要

const float deltX = 0.0002 , deltY = 0.0002;

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

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

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

3
投票

在你的dTdt计算期间,你使用的是T[i-1][j]T[i-1][j]。如果i是最大值(0或500),则超出阵列限制。同样适用于j。因此,您使用未初始化的内存。您需要将1循环到499并根据您尝试解决的问题区别对待边界。


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

© www.soinside.com 2019 - 2024. All rights reserved.