【问题标题】:error: Dereference of undefined pointer value错误:取消引用未定义的指针值
【发布时间】:2020-10-29 11:11:25
【问题描述】:

我正在尝试为 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;
}

【问题讨论】:

  • malloc 一个初始化指针数组然后尝试使用这些指针。
  • @user3121023 谢谢!这摆脱了警告。我把数组复杂化了

标签: arrays c pointers malloc realloc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    表示这个表达式产生的指针

    trace_arr[i]
    

    具有不确定的价值。

    那是你没有初始化指针trace_arr指向的动态分配的数组。

    在 for 循环中,例如 this

     for (i=0; i<limit; i++) {
                trace_arr[i]->head = trace_arr[i]->tail = NULL; <------------- warning
            }
        }
    

    您需要为元素 trace_arr[i] 插入内存​​分配。

    类似

    trace_arr[i] = malloc( sizeof( trace_t ) );
    

    注意该函数是不安全的。例如这个语句中使用的函数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);
    

    即函数将返回成功或失败,原始指针将按值传递给函数。在函数中,您必须检查 malloc 或 realloc 的调用是否成功。

    【讨论】:

    • 啊,我明白了,谢谢。我应该使用 for 循环并在每个 trace_arr[i] 上运行 malloc() 吗?
    • 欢迎来到三星级程序员的世界。 :)
    【解决方案3】:

    trace_arr赋值不会给trace_arr[i]赋值,但是你在trace_arr[i]-&gt;head = …中使用trace_arr[i]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-17
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多