#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"malloc.h"
//动态创建二维数组方法一:
typedef enum{
style_char,
style_short,
style_int
}Array2Style;
typedef struct{
int line;
int row;
Array2Style style;
void * p;
}DynamicArray2;
void initArray2(DynamicArray2 * array2,int line,int row,Array2Style style)
{
int unitLen = 0;
if(style == style_char)unitLen = 1;
else if(style == style_short)unitLen = 2;
else if(style == style_int)unitLen = 4;
array2->p = (void *)malloc(line * row * unitLen);//
array2->line = line;
array2->row = row;
array2->style = style;
}
//获得数组元素指针
void * getArray2DataPtr(DynamicArray2 * array2,int line,int row)
{
int unitLen = 0;
if(array2->style == style_char)unitLen = 1;
else if(array2->style == style_short)unitLen = 2;
else if(array2->style == style_int)unitLen = 4;
if(array2->style == style_char)return (void*)((char*)array2->p + line * array2->row + row);
else if(array2->style == style_short)return (void*)((short*)array2->p + line * array2->row + row);
else if(array2->style == style_int)return (void*)((int*)array2->p + line * array2->row + row);
return NULL;
}
//void *
void main(void)
{
int i,j;
char k = 'a';
DynamicArray2 arr2;
initArray2(&arr2,1,26,style_char);
for(i = 0 ;i < arr2.line;i ++)
{
for(j = 0;j < arr2.row;j ++)
{
*(char*)getArray2DataPtr(&arr2,i,j) = k++;
}
}
for(i = 0 ;i < arr2.line;i ++)
{
for(j = 0;j < arr2.row;j ++)
{
printf("%c ",*((char*)getArray2DataPtr(&arr2,i,j)));
}
}
free(arr2.p);
}
//动态创建二维数组方法二:
/*
#if 1
void main(void)
{
int i,j,k = 0;
char ** twoarray = 0;
int line = 4;
int cow = 4;
twoarray = (char **)malloc(line * sizeof(char *));
for(i = 0;i < line;i ++)
{
twoarray[i] = (char *)malloc(cow * sizeof(char));
}
for(i = 0;i < line;i ++)
{
for(j = 0;j < cow;j ++)
{
twoarray[i][j] = 'a' + k ++;
}
}
for(i = 0;i < line;i ++)
{
for(j = 0;j < cow;j ++)
{
printf("%c",twoarray[i][j]);
}
}
}
#endif */
这篇博客介绍了两种在C语言中动态创建二维数组的方法。第一种方法使用结构体封装数组信息,通过枚举类型定义元素类型,并利用void指针进行内存分配。第二种方法是传统的二维数组创建方式,通过双重循环分配内存并初始化字符数组。这两种方法都展示了C语言在内存管理上的灵活性。
933

被折叠的 条评论
为什么被折叠?



