有关在malloc代码中使用的类型和变量的说明

时间:2019-10-31 09:28:46

标签: c pointers malloc

我需要对这段特定代码中的某些命令进行一些解释:

#inlcude <stdlib.h>
#define PTRS 5

char *p[PTRS];

size_t nbytes = 10;
int i;
/* Allocating memory */
for (i=0; i<PTRS; i++){
    printf("malloc of %10lu bytes ", nbytes);

    if ((p[i] = (char *)malloc(nbytes)) == NULL){
        printf("failed\n");
    } else {
        printf("succeeded\n");
    nbytes *= 100;
}
/* Free the memory allocated */
for (i=0; i<PTRS; i++){
    if(p[i]){
        free(p[i]);
        p[i] = NULL;
    }
}

第一个是
char *p[PTRS];
这行是声明指向数组的指针还是声明指向 pointers 的数组的char?
p[i] = (char *)malloc(nbytes)我知道随着i的增加,p[i]将包含指向malloc调用的已分配内存的指针(如果成功处理的话),而p[i] will be NULL则指向无法准备这种记忆。
第二个是

if (p[i]){
    free(p[i]);
    p[i] = NULL;
}

这仅在p[i]有任何值(在这种情况下为指向内存的指针)时释放内存。如果我们删除if(p[i])而仅使用free(p[i]p[i] = NULL会发生什么?我们可以释放NULL指针吗?

2 个答案:

答案 0 :(得分:2)

char *p[PTRS];

等效于

char *(p[PTRS]);

即它是一个指针数组,而不是指向数组的指针。指向数组的指针例如是

char (*p)[PTRS];

clockwise/spiral rule可能有助于解密声明。就像使用https://cdecl.org这样的资源一样。


您可以将NULL指针传递给free(这是一项禁忌操作),因此实际上不需要进行检查。

取决于p的进一步使用,可能也不需要p[i] = NULL分配。

答案 1 :(得分:1)

  

我了解随着i的增加,p [i]将包含一个指向   由malloc调用的已分配内存

因此,如果您理解这一点意味着p[i]作为数组的元素的类型为char *,因为至少在程序中明确地将这种类型的{{1} }调用if语句

malloc

所以这个声明

 if ((p[i] = (char *)malloc(nbytes)) == NULL){

声明类型为char *p[PTRS]; 的{​​{1}}元素数组。我建议写这样的声明

PTRS

在字符char *之后插入空格。

您也可以按照以下方式重写声明

char * p[PTRS];

以以下方式声明指向'*'类型的char * ( p[PTRS] ); 个元素的数组的指针。

PTRS
  

我们可以释放NULL指针吗?

更确切地说,可以说我们将函数char与空指针一起使用是因为我们没有释放空指针本身,而空指针本身在您的示例上下文中具有自动存储持续时间。

答案是可以的。用空指针调用该函数不会有任何影响,而且是安全的。

因此循环

char ( *p )[PTRS];

可能被重写为

free