c - 双指针是什么意思和指针日期类型大小的malloc

标签 c pointers malloc

int **matrix, i, j;
matrix = malloc(5 * sizeof(int*));
*matrix = malloc(20 * sizeof(int));

我只是不明白双指针的概念以及它如何转化为二维数组(如果它是真的) 提前致谢。

最佳答案

从技术上讲,这里创建的不是二维数组,而是指针数组,每个指针都包含数组的起始地址。然后可以将其编入索引,就好像它是“真正的”二维数组一样。

此行创建一个包含 5 个指向 int 的指针的数组:

matrix = malloc(5 * sizeof(int*));

下一行创建一个数组 20 int:

*matrix = malloc(20 * sizeof(int));

然而,就二维数组而言,这是不完整的,因为只分配了一行。您需要遍历 matrix 指向的每个元素以创建每一行:

int **matrix, i;

matrix = malloc(5 * sizeof(int*));
for (i=0; i<5; i++) {
    matrix[i] = malloc(20 * sizeof(int));
}

当您使用完这个动态二维数组后,您需要以相反的顺序释放内存:

for (i=0; i<5; i++) {
    free(matrix[i]);
}
free(matrix);

这在几个方面不同于真正的二维数组。首先,在真正的二维数组中,所有元素在内存中都是连续的,而在这种情况下,指针数组和每行数组不是。

另一个区别是当被传递给一个函数时,你不能像传递一个真正的二维数组那样传递它。

对于一个简单的一维数组,无论是在编译时分配还是动态分配:

int a1[5];
int *a2 = malloc(5 * sizeof(int));

两者都可以传递给这样的函数:

void f(int *a);

但是对于二维数组:

int a[5][20];

它需要传递给这样的函数:

void f(int a[5][20]);

或等效地:

void f(int (*a)[20]);

而动态二维数组需要像这样传递给函数:

void f(int **a);

关于c - 双指针是什么意思和指针日期类型大小的malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54076643/

相关文章:

iphone - Objective-C : How does 7 - 1 = 3?

c - 将任意大小的整数从 Prolog 传递到 C

c++ - 将 Rcpp 与 C 代码链接起来以进行自适应大都会拒绝采样

java - 将c++代码翻译成java

c - 为函数中结构内部的指针分配内存

c - arm-none-eabi-ld malloc undefined reference

c - C 中释放三维数组时的 SIGTRAP

c++ - 配置:错误:找不到MySQL包含目录

c - 为二维数组中的每一项存储一个值

c - fputc 无法处理大文件?段错误 11