簡體   English   中英

將 memory 分配給 typedef 的指針

[英]allocating memory to pointer of typedef

我用typedef隱藏了一個指針,我正在嘗試創建一個數組。 我的結構是:

typedef struct s {
    int y;
    int x;
    int value;
} s;

typedef s *t;

和主要的:

int main()
{
    t *var;
    int arg;
    var = malloc(sizeof(t*));
    arg = 40;
    for (int x = 0; x < arg; x++)
    {
        var[x] = malloc(sizeof(t));
        var[x]->x = -1;
        var[x]->y = -1;
        var[x]->value = 0;
    }
    for (int x = 0; x < arg; x++)
    {
        printf("|%d| ",var[x]->value);
    }
    return 0;
}

有時它只是出現分段錯誤,有時值只是臟,但這仍然意味着它沒有按意圖分配 memory。 我錯過了什么? 我只是想制作一個t類型的數組,其arg長度必須是一個變量

我用 typedef 隱藏了一個指針

這種非常糟糕的做法是所有錯誤的根源。 只是不要將指針隱藏在 typedef 后面。

因為現在你有一個t* var它實際上是一個s** 然后你調用var = malloc(sizeof(t*)); 這是完全錯誤的,因為您為s**分配了空間。

您應該為40 * sizeof(s*)分配空間,否則var[x]將出現段錯誤。

然后 typedef 與否,這不是一個二維數組,而是一個分段查找表,它增加了額外的復雜性和更慢的代碼,絕對沒有任何收獲。 請參閱正確分配多維 arrays 但是看起來你甚至不需要一個二維數組,那么這一切是從哪里來的呢?

考慮到所有這些,讓 go 使用KISS 原則並從頭開始重寫代碼:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int y;
  int x;
  int value;
} s;

int main (void)
{
  int arg = 40;
  s* var = malloc(arg * sizeof(*var));

  for (int i = 0; i < arg; i++)
  {
    var[i].x = -1;
    var[i].y = -1;
    var[i].value = 0;
  }
  for (int i = 0; i < arg; i++)
  {
    printf("|%d| ",var[i].value);
  }

  free(var);
  return 0;
}

2D 版本將使用s (*var)[y] = malloc( sizeof(s[x][y]) ); 反而。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM