如何在C中处理内存分配

时间:2019-04-16 18:11:41

标签: c

我是C语言的新手,我正在创建一个简单的程序,在其中向多维错误写入值。但是我遇到错误"Segmentation fault"或一段时间,当我运行代码时,它陷入了无限循环。

int main(){
int i,j;
int num1=10; 
int num2=10; 
double data[num1][num2];


    for(i=0;i<=num1;i++){
        for(j=0;j<=num2;j++){
            if(i==0) {
                data[i][j]=121.21;
            }
            else {
                data[i][j]=0.0;
            }
        }
    }
}

当我在以下结构上对值进行硬编码时,它工作正常: 将double data[num1][num2];更改为double data[10][10];

我们如何在C语言中解决此问题。

2 个答案:

答案 0 :(得分:5)

您正在循环中超出数组的范围:

for(i=0;i<=num1;i++){
    for(j=0;j<=num2;j++){

在外部循环中,i的范围是0到num1,而在内部循环中,j的范围是0到num2。但是,每个数组维的最大有效索引分别为num1-1num2-1。在数组末尾进行读/写操作将调用undefined behavior,这就是为什么它有时起作用而有时不起作用的原因。

将循环条件更改为<

for(i=0;i<num1;i++){
    for(j=0;j<num2;j++){

答案 1 :(得分:0)

似乎您正在遍历程序允许您访问的内存。您正在为100个值(10 * 10)分配内存。但是,在大多数编程语言中处理数组时,重要的是要知道索引0的计数为1,这样您就可以从array [0]-array [9]开始,并且声明一个具有10个点的内存的数组,因为我们在大多数编程语言中,从0开始。

解决此问题的一种干净方法是:

for (int i=0; i < num1; i++) {
    for (int j=0; j < num2; j++ {

这将避免访问索引10中未分配的内存位置。