C 中的 malloc 和数组

Sun*_*ark 0 c

我正在学习 C,C 是我的第一门编程语言。我先添加代码。

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

int main() {
    int row = 3, col = 2;

    int(*ptr)[2] = (int(*)[2])malloc(sizeof(int) * row * col);
    if (!ptr) exit(1);
    printf("%d", sizeof(*ptr[0]));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

4

也许,ptr[0]是指针或数组。我应该将其视为ptr[0]数组吗?

Eri*_*hil 5

int (*ptr)[2]声明ptr为一个指向两个数组的指针int

\n

这意味着*ptr是一个包含两个的数组intptr[0]实际上与 相同*ptr,因此它也是一个由两个组成的数组int

\n

根据定义,ptr[0]意味着先加零ptr,然后应用*。添加零不会改变该值,因此ptr[0]有效*ptr

\n

设置ptr(int (*)[2]) malloc(sizeof(int) * row * col);将其设置为指向可用作 3 个 2 数组的内存int(因为rowis 3 和colis 2)。所以这三个数组是ptr[0]ptr[1]ptr[2]

\n

由于其中每一个都是一个由两个组成的数组int,因此它们每个都有两个元素,可以通过ptr[0][0], ptr[0][1], ptr[1][0], ptr[1][1], ptr[2][0], 和来访问ptr[2][1]

\n

请注意,下标运算符[ \xe2\x80\xa6 ]可以与指针或数组一起使用。无论哪种情况,E1[E2]都定义为*((E1) + (E2))。对于指针,此加法以指向的类型为单位进行操作。当E1是指向两个数组的指针时int,添加 1 或 2 会生成一个指针,该指针指向内存中进一步的 1 个或 2 个两个数组int(只要算术保持在适用空间的范围内)。当E1是数组时,它会自动转换为指向其第一个元素的指针,然后像指针一样进行算术。

\n