【问题标题】:Dynamically 2D array in C using the single pointer:使用单指针在 C 中动态二维数组:
【发布时间】:2021-08-22 11:41:10
【问题描述】:

我正在尝试使用单个指针将内存动态分配给二维数组。为此,我有 3 个函数分配各自的内存 newarray() 并将单个元素存储在其中 store(),从中获取元素 fetch( )。我不知道为什么我在测试时遇到执行错误,我也应该为它分配 确切的内存量,这可能是问题,但我不知道该怎么做.这个问题处理一个三角矩阵,在添加元素时,列数应该低于行数,比如我,有一个 5x5 数组,其中 (4,2) 和 (4,4) 可以,但是 ( 4,5) 它不是。

这里是代码


typedef int* triangular;

triangular newarray(int N){
    triangular mat = NULL; //pointer to integer
    //Allocate memory for row
    mat = (int *)malloc(N * N * sizeof(int));
    //Check memory validity
    if(mat == NULL)
    {
        return 1;
    }

    return mat;
}

int store(triangular as, int N, int row, int col, int val){
    if(row >= col){
        as[row * N + col] = val;
        return 1;
    }else if(row < col){
        return -1;
    }else if((row > N) ||(col > N) || (row + col > N + N))
        return -1;
}

int fetch(triangular as, int N, int row, int col){
    int value;
    value = as[row * N + col];
    if((row > N) ||(col > N) || (row + col > N + N) )
        return -1;
    else if(row < col)
        return -1;
    return value;
}

nt main()
{
    int iRow = 0; //Variable for looping Row
    int iCol = 0; //Variable for looping column
    int N;
    triangular mat = newarray(5);

    printf("\nEnter the number of rows and columns = ");
    scanf("%d",&N); //Get input for number of Row

    store(mat,N,3,2,10);
    store(mat,N,3,3,10);
     store(mat,N,4,2,111);
    store(mat,N,3,5,11);
    printf("the element at [3,5] is : %i", fetch(mat,N,3,5));
    //Print the content of 2D array

     for (iRow =0 ; iRow < N ; iRow++)
    {
        for (iCol =0 ; iCol < N ; iCol++)
        {
            printf("\nmat[%d][%d] = %d\n",iRow, iCol,mat[iRow * N + iCol]);
        }
    }

    //free the allocated memory
    free(mat);

    return 0;
}


【问题讨论】:

  • if(mat == NULL) { return 1; }?这种情况下return NULL不是更好吗?
  • 至于你的问题,你记得数组索引是基于 zero 的吗?这意味着索引5(对于行或列)将超出5x5 矩阵的范围。
  • 我认为是这样,但应该不是问题,我想我为所有数组分配了空间,我想我需要为我正在添加的确切元素或其他东西分配空间
  • 请同时包含使用这些函数的代码,因为它们的错误检查不是无懈可击的。
  • store 中的第三条if 语句永远无法执行。在fetch 中,您在检查边界之前读取内存——这会导致未定义的行为。 (您也不要检查负索引,这也可能导致越界访问)。

标签: c pointers matrix malloc dynamic-memory-allocation


【解决方案1】:
int store(triangular as, int N, int row, int col, int val){
    if(row >= col){
        as[row * N + col] = val;
        return 1;
    }else if(row < col){
        return -1;
    }else if((row > N) ||(col > N) || (row + col > N + N))
        return -1;
}

在 store 函数中,首先 if 条件很奇怪。为什么当传递给函数的参数是2(行),3(列)时,您不将值设置为数组。

我通过以下方式更改了您的商店。索引和数组大小是不同的东西,因为索引等于 N - 1。在你的代码中,有很多 if 检查我猜只检查 row 和 col 就足以理解它们在边界内。

int store(triangular as, int N, int row, int col, int val){
    int index = N - 1;

    if((row > N) ||(col > N))
        return -1;

    as[row * index + col] = val;

    return 1;
}

我更改了您的 fetch 功能,如下所示,因为我提到了您的 store 功能。

int fetch(triangular as, int N, int row, int col){
    int value;
    int index = N - 1;
    
   if((row > index) ||(col > index))
        return -1;
   
   value = as[row * index + col];
    
    return value;
}

【讨论】:

  • 你检查边界你存储值(并且可能超出边界)。这些操作需要以相反的顺序发生。边界检查也是错误的,因为N 是无效索引,而您的检查允许它。
  • int store(triangular as, int N, int row, int col, int val){ if(row &gt;= col &amp;&amp; row &lt;= N-1 &amp;&amp; col &lt;= N-1 &amp;&amp; row &gt;= 0 &amp;&amp; col &gt;= 0){ as[row * N + col] = val; return 1; }else if(row &lt; col){ return -1; }else if((row &gt; N-1) ||(col &gt; N-1) || (row + col &gt; (N-1) + (N-1)) return -1; else if(row &lt; 0 || col &lt; 0 || (row &lt; 0 &amp;&amp; col &lt; 0)) return -1; }
  • 我把支票放在商店的开头并取出
  • `for (i=0; i
  • 这是否适用于为三角形矩阵所需的行和列分配内存
【解决方案2】:

你让这变得不必要的复杂。所有这些功能和手动运行时计算都不是必需的。

另外,你还有以下问题:

  • 不要将指针隐藏在 typedef 后面,它只会使代码不可读而无益。
  • 初始化从malloc 返回的数据,或者使用calloc 将所有内容设置为零,这与malloc 不同。
  • C 中的数组是零索引的,因此您无法访问大小为 5x5 的数组中的项 [3][5]。这是一个常见的初学者问题,因为int array[5][5]; 声明了这样一个数组,但array[5][5] 用于索引访问超出了范围。声明和访问的语法不一样,访问需要从0开始。
  • 您没有包含任何标题,我假设您忽略了该部分。

这是一个包含错误修复的简化版本,您可以使用:

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

int main(void)
{
  int N=5;
  int (*mat)[N] = calloc( 1, sizeof(int[N][N]) ); // allocate 2D array dynamically
  if(mat == NULL)
    return 0;

  mat[3][2] = 10;
  mat[3][3] = 10;
  mat[4][2] = 111;
  mat[3][4] = 11;

  for(int i=0; i<N; i++)
  {
    for(int j=0; j<N; j++)
    {
      printf("[%d][%d] = %d\n", i, j, mat[i][j]);
    }
  }

  free(mat);
  return 0;
}

进一步研究:Correctly allocating multi-dimensional arrays

【讨论】:

  • 问题是我需要使用这个设置,malloc 和 typedef,因为这是一个在线练习,我也不完全确定如何为矩阵分配确切的空间,因为现在我我正在为它分配所有空间 NxN
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2013-04-06
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2014-12-31
  • 2012-10-24
相关资源
最近更新 更多