【问题标题】:malloc and array in CC中的malloc和数组
【发布时间】:2022-01-01 18:06:06
【问题描述】:

我正在学习 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;
}

4

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

【问题讨论】:

  • 在 C 中,int(*ptr)[2] = (int(*)[2])malloc(sizeof(int) * row * col); 最好是 int(*ptr)[2] = malloc(sizeof *ptr * row);printf("%d", sizeof(*ptr[0]));printf("%zu", sizeof *ptr[0]);

标签: c


【解决方案1】:

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

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

根据定义,ptr[0] 表示在ptr 上加零,然后应用*。添加零不会改变值,所以ptr[0] 实际上是*ptr

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多