C语言实现一个可变长的二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现一个可变长的二维数组相关的知识,希望对你有一定的参考价值。

这个数组的行数和每行元素的个数都可以由输入决定,要求有正确的释放语句。格式如下:
请输入行数:
请输入第1行元素的个数:
请输入第2行元素的个数:
.
.
.

如果输入5行,没行元素个数分别为54321,则显示结果应该是:
11111
1111
111
11
1
大概是下面这样写,哪位高人给改改
#include<stdio.h>
#include<stdlib.h>
void main()

int i,j,k,n,x,a;
char A[]="a=%d";
char*p=(char*)malloc(sizeof(int)*10);

if(NULL==p)

printf("NULL");

else

printf("请输入有多少个元素:");
scanf("%d",&x);
a=x;
for(i=1;i<=x;++i)

printf("请输入第%d行元素的个数:\n",i);
scanf("%d",p+i);

for(j=1;j<=5;++j)

A[j]=*(p+j);
n=A[j];
for(k=1;k<=n;++k)

printf("1");

printf("\n");



free(p);
p=NULL;


我新号,没积分了,你做做好事吧

int main(int argc, char* argv[])

int a;
printf("请输入行数:");
scanf("%d",&a);
int **p=new int*[a];
int *n=new int[a];
for (int i=1;i<=a;i++)

printf("请输入第%d行元素的个数:",i);
scanf("%d",&n[i-1]);
printf("\n");
int q=n[i-1];
p[i-1]=new int[q];
for (int j=0;j<n[i-1];j++)

p[i-1][j]=1;


for (int x=0;x<a;x++)

for (int y=0;y<n[x];y++)

printf("%d",p[x][y]);

printf("\n");

参考技术A 如果我实现这个我会用到结构体,具体做法加分。给你实现,如果实现一维的在用了一段时间后变长也可以。 参考技术B 数组没有变长的说法的,它是申请一块固定的内存。打印结果数组是能做的,而且数组不用释放语句,自动释放!如果你希望变的话只能动态申请内存,链表正解! 参考技术C C语言的数组在声明的时候就是定长的~
当然定长也可以达到这种效果~
如果真要动态的话~我觉得要用链表~
参考技术D
A[j]=*(p+j);
n=A[j];
这两行语句改为 n = *(p+j) 或者n = p[j]

如何在 C 中声明可变大小的二维数组?

【中文标题】如何在 C 中声明可变大小的二维数组?【英文标题】:How to declare a variable size 2D array in C? 【发布时间】:2012-03-12 00:12:14 【问题描述】:

我的项目有问题。我必须制作一个可变大小的二维数组来存储一些预测错误......所以这是关于图像的。问题是我必须加载不同大小的图像,因此对于每个图像,我必须将具有相应像素数的二维数组放入一个文件中。我已经在你的问题中进行了搜索,但这不是我正在寻找的有谁能帮帮我吗?

谢谢

【问题讨论】:

【参考方案1】:

如果您在函数范围内有现代 C 编译器(至少 C99),那么它很简单:

unsigned arr[n][m];

这称为可变长度数组 (VLA)。如果数组太大,可能会出现问题。因此,如果您有大图像,您可以这样做:

unsigned (*arr)[m] = malloc(sizeof(unsigned[n][m]));

以后

free(arr);

【讨论】:

请记住,上面提到的可变长度数组将被分配到堆栈上。与问题不太相关的第二件事是 C++ 0X 不支持此功能(但是,由于这是一个 C 问题,所以工作正常) @Yavar,这就是为什么我还提到了使用malloc 分配的版本。即便如此,它也是一种“可变修改类型”。而且 C++ 显然还有其他方法来处理多维数组,所以是的,这根本不相关。【参考方案2】:

如果您需要内存是连续的,您有几个选择。

您可以动态分配单个内存块,然后手动计算偏移量,如下所示:

size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]

您可以在主数组中设置第二个指针数组:

int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
  arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;

记住你必须释放 两个 arrarrp

如果你有一个 C99 实现,你可以设置一个指向 VLA 的指针,像这样:

int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;

请注意,在这种情况下,您不需要为辅助数组分配任何内存,也不需要手动计算指向主数组的指针;您所要做的就是将arrp 设置为与arr 相同的位置,然后让指针运算规则完成所有工作。

如果图像不是那么大,您可以设置一个 VLA(同样,C99 或更高版本):

int arr[rows][cols];

但实际上这不是一个好主意;堆栈帧的大小通常非常有限。

【讨论】:

在您的第三种情况下,我认为分配更好,因为我在回答中给出了它。直接malloc就行了,不用强制转换,只会混淆。【参考方案3】:

您需要动态分配内存。使用双指针逻辑。

例如:

int n=10; <<-u can change this.
int **a;
a=(int **)malloc(sizeof(*int)*n);
for (int i=0;i<n;i++)
 a[i]=(int *)malloc(sizeof(int)*n);// or *(a+i)

【讨论】:

当然不是,但你可以让它表现得像一个数组 当您可以简单地使用二维数组时,为什么还要使用模拟? 嗯,这就是原生 C 语言的局限性。动态数组创建,或者说一般的内存分配是 C 语言的一个主要缺陷,让人们望而却步。它仍然是一门很好的语言,因为它赋予了原始力量。这个例子证明了你可以做一些低级的操作来达到预期的结果.. 但是你还是没有回答我的问题。 C 具有动态分配的多维数组。为什么你会模仿语言提供的功能? 恐怕你错了。我不了解 C99 标准,但 K&RC(原始版本)等旧版本不支持“int a[m][n];”之类的东西。

以上是关于C语言实现一个可变长的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何实现可变参函数

C语言初学者项目 200行代码用一个二维数组实现贪吃蛇游戏

c语言如何封装一个带有可变参数的方法?

c语言中如何通过二级指针来操作二维数组

C语言怎么定义一个二维数组可以使每行的输入长度任意

扫雷的分析与实现——C语言