所以有这个代码:
struct HT_Task
{
int tid; /*Task's identifier*/
int difficulty; /*Task's difficulty*/
struct HT_Task *next; /*Pointer to the next node*/
};
struct General_Tasks_HT
{
int count; /*Count of tasks*/
struct HT_Task *tasks[]; /*General tasks hash table*/
};
struct General_Tasks_HT general_tasks_ht; // global variable
unsigned int max_tasks_g;
要为哈希表分配内存,我执行以下操作:
for( i=0; i<max_tasks_g; i++)
{
general_tasks_ht.tasks[i] = malloc(sizeof(struct HT_Task) * max_tasks_g);
}
for( i=0; i<max_tasks_g; i++)
{
general_tasks_ht.tasks[i] = NULL;
}
问题是,当我编译它并在 Windows 笔记本电脑上运行它时,它运行得很好,但在 mac 笔记本电脑上,它在 for 循环中出现分段错误。为什么会发生这种情况,哪个是正确的? (在 Mac 上,clang 版本是 12.0.0,在 Windows MinGw 9.2.0 上)
答案 0 :(得分:3)
未定义行为 (UB)
general_tasks_ht
没有用于其 flexible array member FAM .tasks
的内存,因此未定义将某些内容分配给 general_tasks_ht.tasks[i]
。
在全局内存中使用带有 FAM 的默认初始化 struct
很奇怪。
相反,也许是指向 struct General_Tasks_HT
的指针?
struct General_Tasks_HT *general_tasks_ht_p;
int main() {
int n = 42;
general_tasks_ht_p = malloc(sizeof *general_tasks_ht_p +
n * sizeof *(general_tasks_ht_p->tasks));
general_tasks_ht_p->count = n;
for (int i=0; i < general_tasks_ht_p->count; i++) {
general_tasks_ht_p->tasks[i] = malloc(sizeof *(general_tasks_ht_p->tasks[i]));
}