繁体   English   中英

“实”数组指针和 malloc

[英]“Real” Array pointer and malloc

所以我只是在玩数组指针来看看它们是如何工作的,我下面的示例为 2 个数组指针分配空间,指向一个 10 个整数的数组。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int (*p)[10] = malloc(sizeof(int[10]) * 2);

    for (int arrayI = 0; arrayI < 2; ++arrayI) {
        for (int i = 0; i < 10; ++i) {
            p[arrayI][i] = (arrayI+1) * i;
        }
    }

    for (int arrayI = 0; arrayI < 2; ++arrayI) {
        for (int i = 0; i < 10; ++i) {
            printf("%d\n", p[arrayI][i]);
        }
        printf("\n");
    }
}

这似乎工作正常并给了我:

C:\Users\USERNAME\Desktop>gcc -Wall -Wextra --std=c18 a.c && a.exe
0
1
2
3
4
5
6
7
8
9

0
2
4
6
8
10
12
14
16
18

对于我的问题,你很少看到这样的代码,如果有的话。 做这样的事情有什么危险还是只是“糟糕的代码”。 再说一次,这只是我在玩数组指针。

做这样的事情有什么危险还是只是“糟糕的代码”。

不,这实际上是制作动态分配的二维数组的正确方法。

代替

int (*p)[10] = malloc(sizeof(int[10]) * 2);

我更喜欢

int (*p)[10] = malloc(2 * sizeof *p);

因为p是一个指向 10 个整数数组的指针,所以*p是一个 10 个整数数组。

许多人更喜欢明确发布 memory。 这不是必需的,因为程序无论如何都会终止。 这是基于意见的,但我会补充:

free(p);
return 0;

在程序结束时。

我下面的示例为 2 个数组指针分配空间,这些指针指向一个具有 10 个整数的数组

不,这是一个数组指针int (*p)[10] 这给出了 2 arrays: sizeof(int[10]) * 2

做这样的事情有什么危险吗

唯一的危险是晦涩的取消引用语法。 编写示例的最正确方法是:

 int (*p)[2][10] = malloc(sizeof(int[2][10]));

或同等学历

 int (*p)[2][10] = malloc(sizeof *p);

但是如果你这样做,你必须在取消引用时写出看起来很奇怪的(*p)[i][j] 因此,我们删除最左边的维度,即“手动数组衰减”,并得到一个int (*)[10] ,它实际上是指向int[2][10]数组中第一个元素的指针。 如果需要,您还可以将代码重写为:

int (*arr)[2][10] = malloc(sizeof *arr);
int (*p)[10] = *arr;

此外,您应该始终free已分配的 memory,因为如果您在程序中的某个地方有任何潜伏的指针损坏错误, free通常会导致崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM