为什么我在不同的笔记本电脑上得到相同代码的不同输出?

时间:2020-12-22 01:57:16

标签: c windows unix struct compilation

所以有这个代码:

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 上)

1 个答案:

答案 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]));
  }