函数来清除malloc,并使指针指向null
在我的中,我问过如何使用函数来释放malloc'ed数组,我想改进我的代码,这样函数不仅可以释放内存,还可以在完成清除后将指针设置为函数来清除malloc,并使指针指向null,c,pointers,malloc,C,Pointers,Malloc,在我的中,我问过如何使用函数来释放malloc'ed数组,我想改进我的代码,这样函数不仅可以释放内存,还可以在完成清除后将指针设置为NULL。 此外,我还需要一个函数来完成设置和清除,具体取决于我传递的命令,这是我迄今为止所做的: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdint-gcc.h> char **set_arr(int number,
NULL
。
此外,我还需要一个函数来完成设置和清除,具体取决于我传递的命令,这是我迄今为止所做的:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint-gcc.h>
char **set_arr(int number, char *command);
int command_read(char *command);
void clear_arr(char *arr[], int size);
char set[] = "set";
char clear[] = "clear";
int main() {
int num = // get number from user;
char** my_arr = NULL;
my_arr = set_arr(num, set);
// so far the code works as excepted
set_arr((size_t)&my_arr, clear);
return 0;
}
int command_read(char *command) {
if (strcmp(command, set) == 0)
return 'S';
if (strcmp(command, clear) == 0)
return 'C';
}
char **set_arr(int number, char *command) {
static char **arr = NULL;
static int size;
switch (command_read(command)) {
case 'S':
size = (int)number;
arr = malloc((size + 1) * sizeof(char *));
for (int i = 0; i <= size; i++) {
arr[i] = NULL;
if (i == size)
break;
arr[i] = malloc((string_len) * sizeof(char));
}
break;
case 'C':
clear_arr(arr, size);
free(arr);
uintptr_t value = number;
uint64_t *temp = (void *)value;
*temp = 0x0;
break;
}
return arr;
}
void clear_arr(char *arr[], int size) {
for (int i = 0; i < size; i++) {
free(arr[i]);
arr[i] = NULL;
}
}
#包括
#包括
#包括
#包括
字符**设置数组(整数,字符*命令);
int命令_读取(char*命令);
无效清除arr(字符*arr[],整数大小);
字符集[]=“集”;
字符清除[]=“清除”;
int main(){
int num=//从用户处获取编号;
字符**my_arr=NULL;
my_arr=设置_arr(num,set);
//到目前为止,该准则是例外的
设置arr((尺寸)&我的arr,清除);
返回0;
}
int命令\u读取(char*命令){
如果(strcmp(命令,设置)==0)
返回'S';
如果(strcmp(命令,清除)==0)
返回“C”;
}
字符**设置\u arr(整数,字符*命令){
静态字符**arr=NULL;
静态整数大小;
开关(命令\读取(命令)){
案例S:
大小=(int)个数;
arr=malloc((大小+1)*sizeof(字符*);
对于(int i=0;i,在标准C中不可能编写通用函数来实现您的目标,因为指向不同类型对象的指针可能具有不同的表示形式,因此您无法传递指针的地址,并期望函数以通用方式处理它
然而,C标准中的这一规定并未在当前大多数系统上使用。特别是POSIX标准要求所有指针具有相同的表示形式。因此,您的通用函数可以在这些系统上工作,并采取一些预防措施以避免编译警告:
//释放一组已分配的内容
无空洞数组(空洞***p,大小\u t计数){
void**array=*p;
对于(大小i=0;i0){
自由(数组[i]);
数组[i]=NULL;
}
返回NULL;
}
}
}
返回数组;
}
#定义MALLOC_数组(n,type)((type**)(void*)MALLOC_数组(n,sizeof(type)))
#定义MALLOC_2D_数组(n1,n2,type)((type**)(void*)MALLOC_数组(n1,(n2)*sizeof(type)))
以字符串形式传递命令的效率非常低。您应该使用int
或enum
作为命令,但您可以通过以下方式在程序中使用上述宏和代码:
#包括
#包括
#包括
#包括
int main(){
int string_len=100;
int num=10;//从用户处获取编号;
char**my\u arr=MALLOC\u 2D\u数组(num,string\u len,char);
自由数组(my_arr,num);
返回0;
}
在标准C中,编写通用函数以实现目标是不可能的,因为指向不同类型对象的指针可能具有不同的表示形式,因此您无法传递指针的地址并期望函数以通用方式处理它
然而,C标准中的这一规定并未在当前大多数系统上使用。特别是POSIX标准要求所有指针具有相同的表示形式。因此,您的通用函数可以在这些系统上工作,并采取一些预防措施以避免编译警告:
//释放一组已分配的内容
无空洞数组(空洞***p,大小\u t计数){
void**array=*p;
对于(大小i=0;i0){
自由(数组[i]);
数组[i]=NULL;
}
返回NULL;
}
}
}
返回数组;
}
#定义MALLOC_数组(n,type)((type**)(void*)MALLOC_数组(n,sizeof(type)))
#定义MALLOC_2D_数组(n1,n2,type)((type**)(void*)MALLOC_数组(n1,(n2)*sizeof(type)))
以字符串形式传递命令的效率非常低。您应该使用int
或enum
作为命令,但您可以通过以下方式在程序中使用上述宏和代码:
#包括
#包括
#包括
#包括
int main(){
int string_len=100;
int num=10;//从用户处获取编号;
char**my\u arr=MALLOC\u 2D\u数组(num,string\u len,char);
自由数组(my_arr,num);
返回0;
}
将指针投射到size\u t
并传递到int
至少不是一个好主意。它可能不足以包含指针,也不需要它。将指针投射到size\u t
并传递到int
至少不是一个好主意。它可能不足以包含指针,也不需要它。如果在释放之前,您会将其清空(由于离开s)