将一个字符串数组传递给一个函数

时间:2011-05-06 15:30:51

标签: c arrays malloc

我的节目是

#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。现在我将单个字符串传递给子函数。请指导我。谢谢

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您感到困惑,因为尽管一维数组char[]的行为类似于指针char *,但在二维中,char[][N] 不能转换为{ {1}},实际上更像是char **(指向长度为n的数组的指针)。

因此,如果你想创建一个接收二维数组的函数,你有两个选择:

  1. 使用指针指针:

    (*char)[N]

    要创建char **,请执行以下操作:为指针创建一个数组并为每个指针调用malloc。

  2. 使用二维数组:

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

    棘手的一点是动画一个二维数组:

    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]
    

  3. 您还可以通过选择typedef更容易理解所有这些:

    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));