error: Dereference of undefined pointer value
error: Dereference of undefined pointer value
我正在尝试 malloc/realloc 内存 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;
}
给trace_arr
赋值并没有给trace_arr[i]
赋值,但是你在trace_arr[i]->head = …
中使用了trace_arr[i]
表示这个表达式产生的指针
trace_arr[i]
具有不确定的值。
那是你没有初始化指针指向的动态分配数组trace_arr
。
在 for 循环中,例如这个
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));
可以return一个null-pointer。在这种情况下,分配后您将丢失指向先前分配的内存的原始指针。
更好的方法是按以下方式声明函数
int make_trace_array(trace_t ***trace_arr, int request, int limit);
即函数将 return 成功或失败,原始指针将按值传递给函数。在函数中,您必须检查 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;
}
我正在尝试 malloc/realloc 内存 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;
}
给trace_arr
赋值并没有给trace_arr[i]
赋值,但是你在trace_arr[i]->head = …
trace_arr[i]
表示这个表达式产生的指针
trace_arr[i]
具有不确定的值。
那是你没有初始化指针指向的动态分配数组trace_arr
。
在 for 循环中,例如这个
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));
可以return一个null-pointer。在这种情况下,分配后您将丢失指向先前分配的内存的原始指针。
更好的方法是按以下方式声明函数
int make_trace_array(trace_t ***trace_arr, int request, int limit);
即函数将 return 成功或失败,原始指针将按值传递给函数。在函数中,您必须检查 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;
}