2011-05-06 76 views
0

我的计划是传递字符串数组给一个函数

#define ARRLEN 10 
#define SIZEALCO 128 
#define MAX_STRING_LENGTH 12 
在主要功能

char TYPEDATA_XML_FN[ARRLEN][SIZEALCO]; 
char TYPEDATA_MD5_FN[ARRLEN][SIZEALCO]; 
char identifier[ARRLEN][MAX_STRING_LENGTH]; 
char Temppath[SIZEALCO]; 
int arraynum; 

// ... 

arraynum = 0; 
for(arraynum = 0; arraynum <ARRLEN; arraynum++) 
{ 
    /* Create the file name with the path*/ 
    strcpy(Temppath,"/fw/TYPEDATA/"); 
    nameFil(Temppath,identifier[arraynum],TYPEDATA_XML_FN[arraynum],TYPEDATA_MD5_FN[arraynum]); 
} 

子功能:

void nameFil(char *SourPath,char *InPinName,char *FilePathNameXml,char *FilePathNameMd5) 
{ 
    sprintf(FilePathNameXml, "%s\\%s_TYPEDATA.XML",SourPath,InPinName); 
    sprintf(FilePathNameMd5, "%s\\%s_TYPEDATA.MD5",SourPath,InPinName); 
} 

我你的榜样检查。我用(试验)

char** a = calloc(ARRLEN, sizeof(char *)); 
for(i = 0; i < ARRLEN ; ++i) 
a[i] = ucmalloc(MAX_STRING_LENGTH); 
pase(a); 

子函数:

void pase(char b[ARRLEN][MAX_STRING_LENGTH]) 
{ 
    // ... 
} 

现在,我得到警告消息为 “警告:传递来自兼容的指针类型`PASE”的ARG 1”。

实际上,我想传递完整的字符串数组标识符TYPEDATA_XML_FN,TYPEDATA_MD5_FN。现在我将单个字符串传递给子函数。请引导我。谢谢

回答

0

原型void pase(char b[ARRLEN][MAX_STRING_LENGTH])是相当错误领导,

void pase(char b[][MAX_STRING_LENGTH]) 

效果会更好,因为否则有边界检查的含义(第一阵列的尺寸被忽略)。

你得到“不兼容指针类型”的原因是因为a是一个指针数组。如果a增加(作为指针本身),那么地址将增加一个指针的大小。但是,b是大小为MAX_STRING_LENGTH的数组的阵列,因此如果b增加,则值将增加MAX_STRING_LENGTH。

你分配数组a的方式将(可能)不会给你连续的内存,这就是这里所要求的。你可以使用指针数组来实现你想要的,但是你必须决定你想要做什么。如果你想使用[] []符号,那么你需要

calloc(MAX_STRING_LENGTH,ARRLEN); 
0

你感到困惑,因为虽然是一个维数组char[]行为就像一个指针char *,在两个维度上一个char[][N]转化为char **,实际上更像是一个(*char)[N](指向字符长度为n的数组的指针)。

所以,如果你想接收二维数组的函数,你有两个选择:

  1. 使用指针的指针:

    void f(char ** array, int nrows, int ncols); 
    

    要创建一个char **,像你现在已经在做的那样:为指针创建一个数组,并为它们中的每一个调用malloc。

  2. 使用二维数组:

    void f(char array[][NCOLS], int nrows); 
    //note: NCOLS is a compile time constant now 
    //NROWS is the first dimension and can be omited from array[NROWS][NCOLS] 
    

    棘手位的malloc-ING二维数组:

    char (*my_array)[NCOLS]; 
    //my_identifiers is a pointer to arrays of length NCOLS 
    // it can be passed to any function expecting a car[][NCOLS] 
    
    my_array = malloc(number_of_rows*(sizeof *my_array)); 
    

您也可以更容易地理解所有这些都带有很好的typedefs选择:

typedef char MY_STRING[MAX_STR_LENGTH]; 
//define my strings as arrays of MAX_STRING_LENGTH 

void f(MY_STRING array[]); 

...  

MY_STRING *arr = malloc(nstrings*sizeof(MY_STRING)); 
f(arr); 
相关问题