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 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] = ...;
记住你必须释放 两个 arr
和 arrp
。
如果你有一个 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语言实现一个可变长的二维数组的主要内容,如果未能解决你的问题,请参考以下文章