我的节目是
#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 :(得分: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的数组的指针)。
因此,如果你想创建一个接收二维数组的函数,你有两个选择:
使用指针指针:
(*char)[N]
要创建char **,请执行以下操作:为指针创建一个数组并为每个指针调用malloc。
使用二维数组:
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]
您还可以通过选择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));