所以,我正在使用一些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时,我遇到段错误。谁能深入了解为什么在结构参数(在本例中为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;
}
如果在函数定义中交换参数的顺序,则还需要在数组参数声明或函数调用中交换它们。 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);
否则,load_csv
中csv_data
的维度将与main
中的csv_data
维度相反,导致在某些时候超出范围的数组访问。
顺序应该无关紧要 - 更有可能是你对函数内已更改的值所做的事情 - 您是否更改了调用函数的值的顺序?