【问题标题】:Code seems correct but the program hangs after printing the first row of the array代码似乎正确,但程序在打印数组的第一行后挂起
【发布时间】:2014-08-31 15:59:48
【问题描述】:

我正在尝试使用指针来实现矩阵。代码似乎正确,但程序在打印数组的第一行后挂起。

int main ()
    {
        int **a;
        int i,j;
        int count = 1;

        for (i = 0; i < 4; i++)
        {
            for(j = 0; j < 4; j++)
            {
                *(*(a + i) + j) = count;
                count += 1;
                printf("%d\t", *(*(a + i) + j));
            }
        }
    }

【问题讨论】:

  • 当然提供的代码不起作用。添加一些示例数据,这样我们就不会立即取消引用 NULL
  • 那么到底是不是真的编译器挂了,而不是你的程序?
  • 编译器不打印数组的行,但程序会尝试这样做。我已经相应地解决了这个问题。
  • 您还没有初始化a 或给它任何指向的空间。使用它会导致本质上未定义的行为;令人惊讶的是它没有在 打印数组的第一行之前崩溃。
  • 我建议您删除此问题中的“代码似乎正确”断言。很明显,这是不正确的(因为它不起作用),因此您可以通过对损坏的代码不那么自信来避免不必要的嘲笑。

标签: c arrays pointers


【解决方案1】:

这行得通!

#include<stdio.h>
#include<stdlib.h>
int main ()
{
    int **a;
    int i,j;
    int count = 1;
    // Allocate memory and populate 
    a = malloc(4*sizeof(int*));
    for (i = 0; i < 4; i++)
    {
        a[i] = malloc(4*sizeof(int));
        for(j = 0; j < 4; j++)
        { 
            *(*(a + i) + j) = count;
            count += 1;
            printf("%d\t", *(*(a + i) + j));
        }
        printf("\n");
    }
    //Now free the allocated memory
    for ( i = 0; i < 4; i++)
    {
        free(a[i]);
    }
    free(a);
    return 0;
}

**a 只是一个指向指针的指针,但是在您的代码中,您没有指定该指针应该指向的位置。

首先您需要在使用它之前分配内存,然后执行所需的操作(填充、读取、写入等),一旦您不再需要它,释放分配的内存。

【讨论】:

    【解决方案2】:

    为了让代码有机会工作,您必须为数组分配空间,并为指针分配空间。例如:

    #include <stdio.h>
    
    int main(void)
    {
        int   m[4][4];
        int  *p[4] = { m[0], m[1], m[2], m[3] };
        int **a = p;
        int count = 1;
    
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                *(*(a + i) + j) = count++;
                printf("%d\t", *(*(a + i) + j));
            }
            putchar('\n');
        }
        return 0;
    }
    

    还有其他方法可以指定mp。例如:

    int m[16];
    int *p[4] = { &m[0], &m[4], &m[8], &m[12] };
    

    【讨论】:

      【解决方案3】:

      您的代码中缺少的是内存分配。当您说int** a; 时,您只会得到双指针变量,它应该指向的指针没有空间,中间指针应该指向的整数也没有空间。取消引用这种未初始化的指针是未定义的行为。

      现在,在 C 中分配矩阵的最简单方法是分配一个数组,如下所示:

      int main() {
          int n = 4, count = 1;
          int (*matrix)[n] = malloc(n*sizeof(*matrix));
          for(int i = 0; i < n; i++) {
              for(int j = 0; j < n; j++) {
                  matrix[i][j] = count++;
              }
          }
          free(matrix);
      }
      

      malloc() 分配内存,free() 将其归还以便可以重用。 matrix 是一个指向矩阵的线数组的指针,malloc() 调用为n 的任何matrix 指向的元素分配了足够的内存(即n 线数组中的n 元素)案子)。分配再简洁不过了。

      【讨论】:

        猜你喜欢
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 2016-02-06
        • 2017-06-21
        • 2021-06-17
        相关资源
        最近更新 更多