【发布时间】:2019-10-31 09:28:46
【问题描述】:
我需要对这段特定代码中的一些命令进行一些解释:
#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];
此行是声明一个指向数组的指针,还是声明一个指向char的指针数组?p[i] = (char *)malloc(nbytes)我明白了随着i 的增加,p[i] 将包含一个指向已分配内存的指针,如果它被成功处理,则由 malloc 调用,如果无法准备这样的内存,则 p[i] will beNULL`。
第二个是
if (p[i]){
free(p[i]);
p[i] = NULL;
}
这仅在p[i] 有任何值(在本例中为指向内存的指针)时才释放内存。如果我们删除if(p[i]) 并只使用free(p[i] 和p[i] = NULL 会发生什么?我们可以释放NULL 指针吗?
【问题讨论】:
-
最后一个问题可以参考this question
-
给定
size_t nbytes,您的printf("malloc of %10lu bytes ", nbytes);会调用未定义的行为。size_t的正确格式字符串是%zu。 -
顺便说一句,在现代 C 中不鼓励强制转换
malloc(),因为即使#include <stdlib.h(声明malloc()和朋友的标头)也可以强制代码编译,然后常见的结果是未定义的行为。只有在将void指针引入语言之前(所以malloc()返回char *)之前的(非常旧的)C 版本中才需要。