C中可否用void指针配合malloc声明多维数组?为什么?

查看:126
本文介绍了C中可否用void指针配合malloc声明多维数组?为什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

刚才写了一个程序:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  void *ptr1;
  ptr1 = malloc(2*2*sizeof(int));  //本意是把ptr1作为多维数组,但是不知道如何实现
  *((int*)(ptr1+1)) = 1; //这么用个人理解就是把多维数组摊平了在用
  printf("%d\n",*((int*)(ptr1+1)));
  return 0;
}

那么,是否有办法在不改变 ptr1 的指针类型的前提下(保持void),使ptr[0][1] = 1变得可用,而不需要*((int*)(ptr1+1))这样的写法?
个人实在是想不到可以实现的办法,还请大神们赐教

解决方案

// 首先声明我也是初学者,只是结合自己所学的知识发表一下见解。
// 指针类型是要靠其基类型(int*的基类型为int)来确定寻址时的偏移量的
// void为空类型应该不可以直接使用你这个写法,
// ANSI C使用类型(void*)(指向void的指针)代替(char*)作为通用指针类型。
// 二维数组实际在内存中的位置就是按照一行放完再放下一行的,只是逻辑可以看做二位数组。

// #define M 10
// #define N 10
int (*ptrl)[N];    // 指向有N个元素的一维数组的指针
ptr1 = (int *)malloc(sizeof(int) * M * N);    // M为二位数组的行, N为二位数组的列
这样就可以用ptrl[0][0]的方式访问了。(不会排版,比较矬)

这篇关于C中可否用void指针配合malloc声明多维数组?为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆