Странное поведение при передаче массива методу в C

Я написал метод, который принимает в качестве параметров две станции и массив железнодорожных путей.

typedef enum { MA1, MA2, MA3, MA4, MA5, MA6, MA7, 
    MA8, MA9, MA10, MA11, MA12, MA13, MA14, MA15, MA16} RailwayTrack;

typedef enum { S1, S2, S3, S4, S5, S6} RailwayStation;

typedef struct TrainData {
    int currentProgress;
    RailwayStation startStation;
    RailwayStation endStation;
    int railwayPathLength;
    RailwayTrack *railwayPath;
} TrainData;

#define MAP1_TRAIN_N1 getTrainData(S1, (RailwayTrack[]){ MA1, MA2, MA3, MA8 }, S6)

TrainData getTrainData(RailwayStation startStation, RailwayTrack railwayPath[] /*ERROR HERE?*/, RailwayStation endStation) { 
  TrainData trainData;
  trainData.startStation = startStation;
  for (int i = 0; i < sizeof(railwayPath)/sizeof(RailwayTrack); i++)
  {
    printf("Eli: %d\n",railwayPath[i]);
  }
  //OUTPUT: Eli0, Eli1

  RailwayTrack test[] = { MA1, MA2, MA3, MA8 }; //TEST ARRAY CAUSE ABOVE IS NOT WORKING
  for (int i = 0; i < sizeof(test)/sizeof(RailwayTrack); i++)
  {
    printf("Eli: %d\n",test[i]);
  }
  //OUTPUT: Eli0, Eli1, Eli2, Eli3
  
  trainData.railwayPath = railwayPath;
  trainData.endStation = endStation;
  return trainData;
}

Проблема в том, что массив, указанный в качестве параметра, не будет распечатан полностью, а только до первых двух элементов. Вы можете видеть, что в качестве параметра я передаю массив из 4 элементов, но в журналах видны только первые 2.

Благодаря некоторой помощи я наконец смог понять, что мне также нужно передать размер массива в качестве параметра. Спасибо всем за помощь.

🤔 А знаете ли вы, что...
C компилируется в нативный код, что делает его быстрым и эффективным на большинстве аппаратных платформ.


55
1

Ответ:

Решено

sizeof(railwayPath) дает вам размер указателя, а не массива в C. Вы не передаете массив, а только ссылку (указатель на него).

Вам необходимо передать размер в качестве параметра:

TrainData getTrainData(RailwayStation startStation, RailwayTrack railwayPath[],
                       size_t railwayPathSize, RailwayStation endStation) {