C语言中的参数顺序

时间:2017-06-09 15:48:54

标签: c function multidimensional-array parameters segmentation-fault

所以,我正在使用一些C代码。我已经定义了以下功能:

int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])

如果我调用此函数,一切正常。

但是,如果我更改前两个参数的顺序,那么函数定义如下:

int load_csv(size_t W, size_t L, CSV_DATA csv_data[L][W], char file[])

当我尝试将数据保存到csv_data时,我遇到了段错误。任何人都可以深入了解为什么在struct参数(在本例中为csv_data)之前定义的参数必须处于相同顺序的原因?

编辑:根据要求,这是整个功能:

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

typedef struct{
    enum { is_int, is_float, is_char } type;
    int ival;
    char cval[10];
    float fval;
}CSV_DATA;

int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])
{ 

   char buffer[1024] ;
   char *record,*line;

   int i = 0;

   FILE *fstream = fopen("iris.csv","r");

   if(fstream == NULL)
   {   
      printf("\n file opening failed ");
      return -1 ;
   }   

   while((line=fgets(buffer,sizeof(buffer),fstream))!=NULL)
   {   
    int j = 0;

     record = strtok(line,",");
     printf("%s", record);
     while(record != NULL)
     {   

        csv_data[i][j].type = is_char;
        for (int k=0; k < strlen(record); k++){ 
          csv_data[i][j].cval[k] = record[k];//record;          
        }   

        j++;

     record = strtok(NULL,",");
     //printf("%s", record);

     }   
     ++i;
   }   
  return 0;
}

编辑:这里是调用代码。尽管如此......我没有在被叫函数中的任何地方使用L或W ......

int main(){

        int L = 500;
        int W = 50; 
        CSV_DATA csv_data[500][50];
        char file[10] = "iris.csv";
        load_csv(L ,W , csv_data, file);
        return 0;

}

2 个答案:

答案 0 :(得分:1)

顺序无关紧要 - 你更可能使用已更改的函数内部的值进行操作 - 是否更改了调用函数的值的顺序?

答案 1 :(得分:1)

如果在函数定义中交换参数的顺序,则还需要在数组参数声明或函数调用中交换它们。 IOW,如果你改变了

int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])

int load_csv(size_t W, size_t L, CSV_DATA csv_data[L][W], char file[])

然后要么需要更改csv_data的声明:

int load_csv(size_t W, size_t L, CSV_DATA csv_data[W][L], char file[])

您需要在调用函数中更改参数顺序:

load_csv(L, W, csv_data, file);

load_csv(W, L, csv_data, file);

否则,csv_dataload_csv的维度将与csv_datamain的维度相反,导致某些时候超出范围的数组访问。