【问题标题】:Jagged arrays in C [closed]C中的锯齿状数组[关闭]
【发布时间】:2016-12-20 06:04:19
【问题描述】:

我在寻找 C 中的锯齿状数组时遇到了这段代码。我发现很难理解对 calloc 函数进行类型转换的必要性,因为 calloc() 和 malloc() 返回指针。

int rowNum,colNum,i,j;
int** table;
scanf("%d",&rowNum);

为什么我们使用指向指针的指针,下面的行返回什么?

table = (int**)calloc(rowNum+1,sizeof(int*));
for(i=0;i<rowNum;i++)
{

printf("The size of %d row",i+1);
scanf("%d",&colNum);
table[i] = (int*) calloc(colNum+1,sizeof(int));

上面一行发生了什么?指针是否指向第 i 行的基元素?

for(j=1;j<=colNum;j++)
    {
    //reading the elements in the row
    scanf("%d",&table[i][j]);.
    }
    table[i][0] = colNum;

    printf("The size of row [%d]= %d",i+1,table[i][0]);
    }

table 指向这里的是什么?

【问题讨论】:

  • 请以可读的方式格式化您的代码。不,malloccalloc 不需要强制转换,甚至不应该强制转换,因为这会隐藏细微的错误。否则你的问题不是很清楚。你需要解释一下指针的作用吗?
  • 所以问题在于从callocmalloc 函数返回的指针的类型转换?没有其他的?请尝试更明确。也可能与Do I cast the result of malloc? 重复(如果这是您唯一的问题)。
  • 1) 你不需要这样的强制转换 2) 为什么要为多行和多列分配空间?,数组在 C 中以 0 为基数,使用 table = calloc(colNum, sizeof(int)); 并将 for(j=1;j&lt;=colNum;j++) 更改为 @ 987654332@
  • 在锯齿状阵列上:en.wikipedia.org/wiki/Jagged_array
  • 使问题更清晰。 @JensGustedt 每行的第一个元素用于存储该行中的元素数。

标签: c arrays pointers jagged-arrays


【解决方案1】:

Table 指向动态指针数组的第一个元素。然后我们让这些指针中的每一个都指向 for 循环内的一个整数数组。

这与 2 Dim 数组的不同之处在于,在矩阵中,所有行都有相同的列数。

我们的要求是得到一个锯齿状的数组。取一个包含 5 列的数组 A 和另一个包含 4 列的数组 B,如果将两者组合在不同的行中,则会得到一个锯齿状数组。

既然我们必须像这样分配

table=calloc(rowNum+1,sizeof(int*));
//allocate an array of rowNum pointers and save to table
...
table[i] = calloc(colNum+1,sizeof(int));
//Yes it is pointing to the first element of the i-th row

换句话说,每个 table[i] 代表具有可变列数的每一行(这里由用户给出)。

我想这些链接可以帮助你

【讨论】:

  • 不是反对者,而是问题被标记为 C(不是 C++)。请阅读Do I cast the result of malloc?
  • "至于类型转换是因为 ....",可惜不是。在 C 中,void-指针不需要显式转换。这与 C++ 不同。
  • @AlterMann 我改了,有点仓促回答抱歉。
  • "Table 指向一个动态的指针数组。" 也不安静。 table 指向一个指向int 的指针,一个int*。其中 可能 是数组的第一个元素。例如,指向 42 个 int*s 数组的指针看起来像这样 int * (*pa)[42]
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2013-12-27
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多