Arrays 错误:取消对未定义指针值的引用

Arrays 错误:取消对未定义指针值的引用,arrays,c,pointers,malloc,realloc,Arrays,C,Pointers,Malloc,Realloc,我正在尝试为跟踪结构数组分配malloc/realloc内存 typedef struct { step_t *head; // pointer to the step in the head of the trace step_t *tail; // pointer to the step in the tail of the trace } trace_t; 我认为代码运行良好,但我的编译器输出了一个未定义指针值的取消引用警告。这是什么意思?在导致错误的那一

我正在尝试为跟踪结构数组分配malloc/realloc内存

typedef struct {
    step_t *head;     // pointer to the step in the head of the trace
    step_t *tail;     // pointer to the step in the tail of the trace
} trace_t;
我认为代码运行良好,但我的编译器输出了一个未定义指针值的取消引用警告。这是什么意思?在导致错误的那一行中,我只是试图将trace\t数组中每个trace\t的head和tail指针设置为NULL

trace_t** 
make_trace_array(trace_t** trace_arr, int request, int limit) {
    int i;
    if (request==MALLOC) {
        trace_arr = (trace_t**)malloc(limit*sizeof(*trace_arr));
        assert(trace_arr!=NULL);
        for (i=0; i<limit; i++) {
            trace_arr[i]->head = trace_arr[i]->tail = NULL; <------------- warning
        }
        return trace_arr;
    } else if (request==REALLOC) {
        trace_arr = (trace_t**)realloc((trace_t**)trace_arr, (limit*2)*sizeof(*trace_arr));
        assert(trace_arr!=NULL);
        // may b bug
        for (i=limit; i<limit*2; i++) {
            trace_arr[i]->head = trace_arr[i]->tail = NULL; <------------- warning
        }
        return trace_arr;
    }
    printf("Invalid request");
    return NULL;
}

给trace\u arr赋值并不给trace\u arr[i]赋值,但在trace\u arr[i]->head=…

给trace\u arr赋值并不给trace\u arr[i]赋值,而是在trace\u arr[i]->head=…

中使用trace\u arr[i],这意味着这个表达式产生的指针

trace_arr[i]
具有不确定的值

也就是说,您没有初始化指针跟踪指向的动态分配数组

在for循环中,例如

 for (i=0; i<limit; i++) {
            trace_arr[i]->head = trace_arr[i]->tail = NULL; <------------- warning
        }
    }
注意功能不安全。例如,此语句中使用的函数realloc

trace_arr = (trace_t**)realloc((trace_t**)trace_arr, (limit*2)*sizeof(*trace_arr));
可以返回空指针。在这种情况下,在分配之后,您将丢失指向先前分配的内存的原始指针

更好的方法是按以下方式声明函数

int make_trace_array(trace_t ***trace_arr, int request, int limit);

也就是说,函数将返回success或failure,原始poiner将通过值传递给函数。在函数中,您必须检查malloc或realloc的调用是否成功。

这意味着此表达式生成的指针

trace_arr[i]
具有不确定的值

也就是说,您没有初始化指针跟踪指向的动态分配数组

在for循环中,例如

 for (i=0; i<limit; i++) {
            trace_arr[i]->head = trace_arr[i]->tail = NULL; <------------- warning
        }
    }
注意功能不安全。例如,此语句中使用的函数realloc

trace_arr = (trace_t**)realloc((trace_t**)trace_arr, (limit*2)*sizeof(*trace_arr));
可以返回空指针。在这种情况下,在分配之后,您将丢失指向先前分配的内存的原始指针

更好的方法是按以下方式声明函数

int make_trace_array(trace_t ***trace_arr, int request, int limit);

也就是说,函数将返回success或failure,原始poiner将通过值传递给函数。在函数中,您必须检查malloc或realloc的调用是否成功。

您需要一个结构数组,但您可以像处理指针数组一样处理它。 你需要摆脱一个间接层次。 这可能如下所示:未编译:

trace_t* 
make_trace_array(trace_t** trace_arr, int request, int limit) {
    int i;
    assert(trace_arr != NULL);
    if (request==MALLOC) {
        trace_t *arr = malloc(limit*sizeof(*arr));
        assert(arr!=NULL);
        for (i=0; i<limit; i++) {
            arr[i].head = arr[i].tail = NULL;
        }
        *trace_arr = arr;
        return arr;
    } else if (request==REALLOC) {
        trace_t *arr = realloc(*trace_arr, (limit*2)*sizeof(*arr));
        assert(arr!=NULL);
        for (i=limit; i<limit*2; i++) {
            arr[i].head = arr[i].tail = NULL;
        }
        *trace_arr = arr;
        return arr;
    }
    printf("Invalid request");
    return NULL;
}

您需要一个结构数组,但您可以像处理指针数组一样处理它。 你需要摆脱一个间接层次。 这可能如下所示:未编译:

trace_t* 
make_trace_array(trace_t** trace_arr, int request, int limit) {
    int i;
    assert(trace_arr != NULL);
    if (request==MALLOC) {
        trace_t *arr = malloc(limit*sizeof(*arr));
        assert(arr!=NULL);
        for (i=0; i<limit; i++) {
            arr[i].head = arr[i].tail = NULL;
        }
        *trace_arr = arr;
        return arr;
    } else if (request==REALLOC) {
        trace_t *arr = realloc(*trace_arr, (limit*2)*sizeof(*arr));
        assert(arr!=NULL);
        for (i=limit; i<limit*2; i++) {
            arr[i].head = arr[i].tail = NULL;
        }
        *trace_arr = arr;
        return arr;
    }
    printf("Invalid request");
    return NULL;
}

您可以创建一个初始化指针数组,然后尝试使用这些指针。@user3121023谢谢!这就消除了警告。我把数组复杂化了,你需要初始化一个指针数组,然后尝试使用这些指针。@user3121023谢谢!这就消除了警告。我把数组复杂化了我明白了,谢谢。我是否应该使用for循环并在每个跟踪上运行malloc_arr[I]呢?欢迎来到三星级程序员的世界啊,我明白了,谢谢。我是否应该使用for循环并在每个跟踪上运行malloc_arr[I]呢?欢迎来到三星级程序员的世界