所以我必须在C中进行练习,我必须创建一个二维数组作为“场”。我们得到了typedef char name[300][300]
这个词。现在我想在这个typedef char名称上使用malloc,但我无法弄清楚(我是C中的初学者)。我一直在互联网上搜索,但找不到一个带有typedef char的例子,我没有计划如何做到这一点。我是否必须创建一个指针或一些特殊的魔法来使用malloc或我错过了什么?
答案 0 :(得分:3)
type *p = malloc(sizeof *p);
几乎都是一般的。
#include <stdio.h>
#include <stdlib.h>
typedef char name[300][300]; //makes `name` a typedef for `char[300][300]`;
int main()
{
name *p = malloc(sizeof *p);
printf("%zu\n", sizeof *p); //verify that this is 300*300==90000 bytes large
}
答案 1 :(得分:2)
typedef char name[300][300]
动态内存分配?#include<stdio.h>
#include<stdlib.h>
typedef char name[300][300];
int main(){
name *namelist= malloc(sizeof *namelist); // we are pointing to char [300][300]
/* check the return value of malloc */
if( namelist == NULL ){
fprintf(stderr,"%s\n","Error in malloc");
exit(1);
}
for(int i=0;i<5;i++)
scanf("%299s",(*namelist)[i]); // dereferencing it to acccess the 2d array
for(int i=0;i<5;i++)
printf("%s\n",(*namelist)[i]);
free(namelist);
return 0;
}
此处使用小代码显示typdef
的使用。
typedef char name[300][300]
我们将name
与char [300][300]
类型相关联。
将
name
定义为类型为300
元素数组的300
元素数组char
。
现在指向这个指针基本上是指向二维数组char[300][300]
或简称为char (*)[300][300]
的指针。
这就是为什么我们需要先取消引用变量(*namelist)
,然后再访问2d数组。
<子> 子>
为什么sizeof *namelist = 90000 Byte
?
因为*namelist
表示2d数组。从标准§6.5.3.4
当
sizeof
应用于类型为char
,unsigned char
或signed char
的操作数(或其合格版本)时,结果为1
。 当应用于具有数组类型的操作数时,结果是数组中的总字节数。
因此该数组具有300 x 300 = 90000
个char变量,每个变量都是1个字节。所以90000
字节。
强调添加
答案 2 :(得分:1)
这不是您必须使用的,但您也可以将char name[300][300]
表包装在您自己的类型中:
#include <stdio.h>
#include <stdlib.h>
typedef struct my_array_type { char name[300][300]; } my_array_type;
int main(int argc, char* argv[]){
my_array_type * my_table = malloc(sizeof *my_table);
printf("%zu\n", sizeof *my_table);
return 0;
}