2011-05-06 97 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); 
相關問題