arrays - 错误:取消引用未定义的指针值
问题描述
我正在尝试为 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_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;
}
推荐阅读
- firebase - 如何从firebase获取特定时间戳后的数据
- gcc - Linux bootc.c 中的 GCC 内联汇编:汇编程序消息:错误:表达式后出现垃圾 'int 0x10h'
- java - 如何使用 Scanner.hasNextInt() 检查下一个 3 输入是否为 int 并仅在 java 中循环
- google-app-maker - 舍入绑定表达式 appmaker
- javascript - 稍微调整一下我的图像滑块(添加过渡动画)
- c# - 如何使用自适应卡片从 FormFlow 中保存和检索用户响应?
- python - 如何使用用户名是别名的 OAuth2.0 对 Office365 用户进行身份验证?
- opentext - OpenText Content Suite Platform:用于查找用户类型的数据库表
- ios - IOS/Objective-C/AVFoundation:是否应该为每次录音重新创建audioEngine
- python - Pandas Dataframe Parquet 数据类型?