首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >P=(int(*)[3])malloc(3*sizeof of (*p))的含义是什么?

P=(int(*)[3])malloc(3*sizeof of (*p))的含义是什么?
EN

Stack Overflow用户
提问于 2017-04-03 08:39:46
回答 2查看 834关注 0票数 1
代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>

int main()
{
     int i, j;
     int(*p)[3];
     p = (int(*)[3])malloc(3*sizeof(*p));
     for(i=0; i<3; i++)
     {
         for(j=0; j<3; j++)
             printf("%d", p[i][j]);
     }
     return 0;
}

P是指向3整数数组的指针,那么为什么它表现为2D数组呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 08:52:16

这是一个完全多余的演员,只会增加杂乱。或者在C++的情况下,它是必要的,但您不应该在C++中使用malloc .

p是指向int [3]类型数组的数组指针。*p是一个数组,因此3*sizeof(*p)给出了3个这样的数组的大小,即3*3*sizeof(int)。因此,代码分配一个数组-一个2D数组。

p设置为指向该数组的第一个元素。p[i]是数组指针上的指针算法,并给出数组号i。因此,指向一维数组的指针可用于访问2D数组。

编写malloc调用的更好方法是:

代码语言:javascript
复制
p = malloc( sizeof(int[3][3]) );

您的示例从不初始化数组,因此打印它们的内容会产生垃圾,甚至可能是未定义的行为。修正代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
     int(*p)[3];
     p = malloc( sizeof(int[3][3]) );
     for(size_t i=0; i<3; i++)
     {
         for(size_t j=0; j<3; j++)
         {
             p[i][j] = (int)j;
             printf("%d ", p[i][j]);
         }
         printf("\n");
     }

     free(p);
     return 0;
}

相关话题:Correctly allocating multi-dimensional arrays

票数 2
EN

Stack Overflow用户

发布于 2017-04-03 08:42:58

malloc是一个命令,它根据所需数据的大小(以字节为单位)分配一个内存块。在这种情况下,您试图为大小为3的整数数组分配一个内存块,同时sizeof()是一种获取实际字节大小的方法,内存大小将用于数据类型,在这种情况下,数据类型是整数。因为您需要一个大小为3的数组,这就是为什么3乘法器来了,并且比您希望的那样将其作为指针类型转换到一个整数数组中,其大小为3,以便稍后使用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43180061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档