Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数来清除malloc,并使指针指向null_C_Pointers_Malloc - Fatal编程技术网

函数来清除malloc,并使指针指向null

函数来清除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,

在我的中,我问过如何使用函数来释放malloc'ed数组,我想改进我的代码,这样函数不仅可以释放内存,还可以在完成清除后将指针设置为
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)