使用malloc作为typedef char名称[300] [300]? (C)

时间:2017-12-03 16:51:58

标签: c arrays malloc

所以我必须在C中进行练习,我必须创建一个二维数组作为“场”。我们得到了typedef char name[300][300]这个词。现在我想在这个typedef char名称上使用malloc,但我无法弄清楚(我是C中的初学者)。我一直在互联网上搜索,但找不到一个带有typedef char的例子,我没有计划如何做到这一点。我是否必须创建一个指针或一些特殊的魔法来使用malloc或我错过了什么?

3 个答案:

答案 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]

我们将namechar [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应用于类型为charunsigned charsigned 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;
}