我正在尝试动态分配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);
}
程序在运行时崩溃。有人可以评论吗?
答案 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);
如果您使用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编译器 - 时间来获得一个。