【问题标题】:Runtime error in dynamically allocating 2D array in C在 C 中动态分配二维数组时出现运行时错误
【发布时间】:2014-04-10 22:58:03
【问题描述】:

我正在尝试动态分配一个二维数组、放置一些值并打印输出。但是,似乎我在 atoi() 函数中获取程序的输入时犯了错误。

基本上,当我们分配一个静态二维数组时,我们将其声明为 int a [3][3]。所以 3 * 3 个单位如果是 int,那么分配了那么多内存。分配动态数组也一样吗?

这是我的代码:

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

int main(int arg,char* argv)
{
int rows = atoi(argv[1]);
int col = atoi(argv[2]);

int rows =3;
int col=3;
int i,j;

int (*arr)[col] = malloc(sizeof (*arr)*rows);

int *ptr = &(arr[0][0]);
int ct=1;
for (i=0;i<rows;i++)
{
    for(j=0;j<col;j++)
    {
        arr[i][j]=ct;
        ct++;
    }
}   

printf("printing array \n");
for (i=0;i<rows;i++)
{
    for(j=0;j<col;j++)
    {
        printf("%d \t",arr[i][j]);
    }
    printf("\n");
}   

free(arr);

return (0);
}

程序在运行时崩溃。有人可以评论吗?

【问题讨论】:

  • 我运行程序为:array 3 3
  • 虽然这不是确切问题的答案,但我不会使用双索引数组。最后,它只是连续的内存。像int *arr = malloc(sizeof(int) * row * col); arr[r * row + c] = ... 这样的东西相当于arr[r][c]。
  • 将您的声明更改为int (*arr)[col] = malloc(sizeof(*arr) * rows)。 一切 其他都应该按原样工作。如果您想知道为什么会这样,请考虑int *p = malloc(sizeof(*p) * 10); 的工作原理,以及稍后如何使用p[i] 访问刚刚分配的10 个值。这没有什么不同。只有底层类型发生了变化。

标签: c arrays multidimensional-array


【解决方案1】:

我看到的第一个问题是这一行:

int (*arr)[rows][col] = malloc(sizeof (*arr) * rows);

这根本没有问题,因为实际上您分配的内存超出了您的需要。这样就足够了:

int (*arr)[rows][col] = malloc(sizeof (*arr));

sizeof *arr 就足够了,因为*arr 的类型是int [rows][cols];您想要的内存正是该数组的大小。 sizeof 运算符在应用于数组时会为您提供整个数组的计数。

但是,您的代码的主要问题是您如何使用arr。您使用arr[i][j] 对其进行索引,但您应该使用(*arr)[i][j],因为arr 不是 一个数组,它是一个指向数组的指针。您需要在任何进一步的索引之前取消引用它 - 就这么简单。 arr[i][j] 等价于 *(*(arr+i)+j)。注意i 应该是*arr 的偏移量,而不是arr 的偏移量。这就是为什么您需要在索引之前取消引用 arr。

【讨论】:

    【解决方案2】:

    由于您已经在使用可变长度数组,您可以利用它:

    int (*arr)[col] = malloc(sizeof *arr * rows);
    

    通过这种方式,您可以使用通常的语法 arr[i][j] 简单地访问元素,而无需担心指针和取消引用,指针算法将为您完成所有工作。

    此外,由于索引从 0 开始,您的测试应该类似于 i &lt; rows 和 j &lt; col。 对于错误的main 声明和第二个printf,您有一些小错误。

    【讨论】:

    • 我将第一行修改为 int (*arr)[col] = malloc(sizeof (*arr)*rows);第二个 printf 语句为 printf("[%d][%d] \t",arr[i][j]);并固定 for 循环等式。仍然程序在运行时崩溃。
    • @user35197339 你修正了主要声明吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2018-06-16
    • 2010-12-27
    • 1970-01-01
    • 2021-03-25
    • 2021-08-04
    • 2014-05-02
    • 2015-12-20
    相关资源
    最近更新 更多