我需要对这段特定代码中的某些命令进行一些解释:
#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
指针吗?
答案 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