首页 > 解决方案 > 错误:取消引用未定义的指针值

问题描述

我正在尝试为 trace_t 结构数组分配/重新分配内存。

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 的头和尾指针设置为 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;
}

标签: arrayscpointersmallocrealloc

解决方案


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

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;
}

推荐阅读