C中动态分配的数组中的错误

时间:2014-04-11 12:41:44

标签: c dynamic-arrays

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

基本上,当我们分配静态2D数组时,我们将其声明为int a [3] [3]。因此,如果为3 * 3单位,则分配大量内存。同样适用于分配动态数组吗?

这是我的代码:

#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);
}

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

4 个答案:

答案 0 :(得分:3)

尝试将第三行更改为:

int main(int arg,char **argv)

答案 1 :(得分:1)

使用动态矩阵的常用方法是使用指向某事物的指针,然后动态分配两个“维度”:

int **arr = malloc(sizeof(*arr) * rows);
for (int i = 0; i < rows; ++i)
    arr[i] = malloc(sizeof(**arr) * col);

请记住,要释放矩阵,您必须先在循环中释放所有“行”。

答案 2 :(得分:0)

int rows = atoi(argv[1]);
int col = atoi(argv[2]);

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

您正在定义行和col两次....这将无法工作!

答案 3 :(得分:0)

对于传统的C,您只能让多维数组的array[][]结构与编译时常量值一起使用。否则,指针算术不正确。

对于动态大小的多维数组(在运行时确定行和列的那些数组),您需要执行此类型的其他指针算法:

int *a;
int rows=3;
int cols=4;
a = malloc(rows * cols * sizeof(int));
for (int i = 0; i < rows; ++i)
   for (int j = 0; j < cols; ++j)
   a[i*rows + j] = 1;

free(a); 

或者,you can use double indirection and have an array of pointers each pointing to a one dimensional array

如果您使用GCC或任何C99编译器,使用variable length arrays可以简化多维数组的动态计算:

// This is your code -- simplified
#include <stdio.h>
int main(int argc, const char * argv[])
{
    int rows = atoi(argv[1]);
    int col = atoi(argv[2]);

    // you can have a rough test of sanity by comparing rows * col * sizeof(int) < SIZE_MAX

    int arr[rows][col];     // note the dynamic sizing of arr here

    int ct=1;
    for (int i=0;i<rows;i++)
        for(int j=0;j<col;j++)
            arr[i][j]=ct++;

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

    return 0;
}  // arr automatically freed off the stack

使用可变长度数组(&#34; VLA&#34;),C中的动态多维数组变得更加容易。

比较

void f1(int m, int n)
{
    // dynamically declare an array of floats n by m size and fill with 1.0
    float *a;
    a = malloc(m * n * sizeof(float));
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < n; ++j)
        a[i*n + j] = 1.0;
    free(a);    
}

使用VLA,你可以写同样的事情:

void f2(int m, int n)
{
  // Use VLA to dynamically declare an array of floats n by m size and fill with 1.0  
  float a[m][n];
  for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++j)
      a[i][j] = 1.0;
}

请注意,与malloc / free不同,VLA处理请求大于堆栈可用大小的处理并不像使用malloc和测试NULL指针那样容易检测到。 VLA基本上是automatic variables,并且具有类似的易用性和限制。

VLA最适合用于堆栈的小型数据结构。使用更健壮的malloc / free并适当检测较大数据结构的故障。

如果你没有使用支持C99的相当新的老式C编译器 - 时间来获得一个。