malloc二维动态数组(malloc函数定义二维数组)

http://www.itjxue.com  2023-01-26 20:53  来源:未知  点击次数: 

C语言如何动态分配二维数组??

动态分配二维数组:

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

{

int NC=100, NR=200;

int i,j;

char **a; // a[NR][NC] -- *a[NR] -- a[j][i]

a = (char **) malloc(sizeof(char *) * NR);

for (j=0;jNR;j++){

a[j] = (char *) malloc(sizeof(char) * NC);

}

// 释放空间: free(a);

编译错误是因为p[j]=(char *)malloc,而不是题目的(char *)malloc(n*sizeof(char))。

扩展资料:

二维数组的动态分配

二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((i ? p) * n + (j ? q)) * t

按“列优先顺序”存储时,地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((j ? q) * m + (i ? p)) * t

存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。

参考资料来源:百度百科--二维数组

参考资料来源:百度百科--C语言

c中怎么用malloc动态申请二维数组

二级指针申请两次就可以了(一个并不等价于二维数组的数组),不过一般不这么干,因为一维数组完全可以达到二维数组的效果

怎样动态分配二维数组内存

1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。

2、例程,分配3行4列二维数组:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include stdio.h

#include malloc.h

int main()

{

int **a;

int i, j;

a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行

for (i = 0; i 3; ++i){//为每列分配4个大小空间

a[i] = (int*)malloc(sizeof(int)*4);

}

//初始化

for (i = 0; i 3; ++i){

for (j = 0; j 4; ++j){

a[i][j] = i+j;

}

}

//输出测试

for (i = 0; i 3; ++i){

for (j = 0; j 4; ++j){

printf ("%d ", a[i][j]);

}

printf ("\n");

}

//释放动态开辟的空间

for (i = 0; i 3; ++i){

free(a[i]);

}

free(a);

return 0;

}

/*

输出:

0 1 2 3

1 2 3 4

2 3 4 5

*/

c语言:怎样用malloc函数动态分配二维数组,使之可输入数组的行数和每行的列数。

这个是可以的,但是和其他网友说的一样,内存是线性的,当你在语言中分配一个多维数组的时候,编译器其实也是分配线性内存的,但是我们可以通过模拟来实现类似数组的操作,下面演示一个分配以及操作数组的实例(列数要固定,这里假设列数为4):

int _tmain(int argc, _TCHAR* argv[])

{

int (*p)[4] = (int (*)[4])0;

int row = 3;

int (*mem)[4] = (int (*)[4])0; // 定义数组首指针

mem = (int (*)[4])malloc(sizeof(int(*)[4]) * row); // 分配row行, 4列的数组

// 分别为二维数组的第一维各个元素赋值。

mem[0][0] = 1;

mem[0][1] = 2;

mem[0][2] = 3;

mem[0][3] = 4;

// 打印二维数组的各个元素的值

printf("%d, %d, %d, %d", mem[0][0], mem[0][1], mem[0][2], mem[0][3]);

free(mem);

return 0;

}

不过这里列数必须指定,还有一种方法,这种方法可以保证用户输入任意行或列,而不必要将列数定死,演示如下:

int getElement(int* arr, int colNum, int row, int col);

void setElement(int* arr, int colNum, int row, int col, int val);

int _tmain(int argc, _TCHAR* argv[])

{

int *arr = (int*)0;

int row = 3;

int col = 5;

//分配 row 行 col 列的整形数组

arr = (int*)malloc(sizeof(int) * col * row);

// 将最后一个元素值设置为100

setElement(arr, col, 2, 4, 100);

//输出最后一个元素的值

printf("%d", getElement(arr, col, 2, 4));

free(arr);

return 0;

}

//各个参数说明如下:

//arr: 数组首地址

//colNum:数组列数

//row: 要取得的元素所在行

//col: 要取得的元素所在列

int getElement(int* arr, int colNum, int row, int col)

{

return *(arr + sizeof(int) * (row - 1) * colNum + col);

}

// 此函数用来设置指定行和列的元素的值:

//arr: 数组首地址

//colNum:数组列数

//row: 要取得的元素所在行

//col: 要取得的元素所在列

//val: 要设置的值

void setElement(int* arr, int colNum, int row, int col, int val)

{

*(arr + sizeof(int) * (row - 1) * colNum + col) = val;

}

其实归根到底,还是对指针的操作,希望可以帮到你,呵呵。

C++语言malloc创建二维数组问题

首先要理解

int* ptr = (int*)malloc(5 * sizeof(int)); // 动态分配5个整型的内存空间,跟int a[5]相似,但前者是堆上分配的,后者是栈上分配的

p=(int **)malloc(sizeof(int*)*5); // 意思就是定义一个有5个int类型的指针的动态数组,然后在里面存放指针

p[i] 其实就是一个指针

p[i]=(int *)malloc(sizeof(int)*5); // 给该指针分配内存

C语言用malloc定义二维数组问题

首先,p的类型为 int **

那么p和p+1,相差一个int类型嘛

p先申请了 5个数组长度

后来p[i]又申请了5个数组长度,分别保存在刚才申请的5个元素里

所以,这就相当于定义了P[5][5]咯。。这个大概就是这个意思啦,要画图的话,才好讲。。

至于第二个问题。。。听不懂,哈哈。。**p就是指向指针的指针嘛(不要骂人哈,本来就是嘛)

返回值只有相对于函数,才有返回值之说。。

通俗的讲,**p 是指针的指针, p[i]是指针

如果p定义为p[][],那么,p就是指针的指针, p[i]就是指针 和上面定义是一样的

PS:网上讲解指针的指针的文章多了去了,我在这里也讲不明白,那些文章都条例清晰,内容深入。。回答完毕,给点分下载文库吧

(责任编辑:IT教学网)

更多

推荐Windows服务器文章