问题
今天想用一个二维字符串数组保存字符串,在参数传递过程中发现返回的结果不对,上网一搜,发现二维数组作为形参传递不像一维数组那么简单,请看以下详细分析。
异常代码:
int StrCut(char* pinput, char **ppOut)
{
char *p = NULL;
int count = 0;
if (NULL == pinput)
{
return -1;
}
printf("input:%s\n", pinput);
p = strtok(pinput, "/");
printf("<%p>p:%s\n", p, p);
strcpy(&(ppOut[count]), p);
printf("<%p>ppOut[%d]:%s\n", &(ppOut[count]), count, &(ppOut[count]));
count++;
while((p = strtok(NULL, "/")))
{
printf("<%p>p:%s\n", p, p);
strcpy(&(ppOut[count]), p);
printf("<%p>ppOut[%d]:%s\n", &(ppOut[count]), count, &(ppOut[count]));
count++;
}
return count;
}
int main()
{
int i;
int nCnt;
char aaCutRtn[10][64];
char *str = "123/abc/456/efg"
for(i = 0; i < 10; i++)
{
memset(aaCutRtn[i], 0, sizeof(aaCutRtn[i]));
printf("<%p>&aaCutRtn[%d] <%p>&aaCutRtn[%d][0] <%p>aaCutRtn[%d]\n", &aaCutRtn[i], i, &aaCutRtn[i][0], i, aaCutRtn[i], i);
}
nCnt = StrCut(str , aaCutRtn);
printf("nCnt [%d]\n", nCnt );
if (nCnt > 0)
{
for(i = 0; i < nCnt ; i++)
{
printf("<%p>aaCutRtn[%d]:%s\n", aaCutRtn[i], i, aaCutRtn[i]);
}
}
}
int StrCut(char* pinput, char **ppOut)
运行中加了打印信息,&aaTopic[0]是aaTopic[0]的地址,即第0行的首地址,aaTopic[0]本身是aaTopic[0][0]的地址,即&aaTopic[0][0],都是相等的。注意到函数的第二个参数是指针的指针,在函数内部对ppOut[count++]初始化时,实际上每次指针只偏移了4个字节,即一个指针的长度,所以返回的结果一定是错误的。通过网上查找资料发现,对于二维数组的传递,是要传递具体的列数,或者转换成一维数组指针后再传递,具体方法如下:
解决方法
- 形参给出第二维的长度
#include <stdio.h>
void func(int n, char str[ ][5] )
{
int i;
for(i = 0; i < n; i++)
printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
func(3, str);
}
- 形参声明为指向数组的指针
#include <stdio.h>
void func(int n, char (*str)[5] )
{
int i;
for(i = 0; i < n; i++)
printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
func(3, str);
}
- 形参声明为指针的指针
#include <stdio.h>
void func(int n, char **str)
{
int i;
for(i = 0; i < n; i++)
printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
p[0] = str[0];
p[1] = str[1];
p[2] = str[2];
func(3, p);
}
所以开头的代码只要修改参数为如下所示,运行结果正常。
int TopicCut(char* pinput, char (*ppOut)[64])
参考:
https://blog.csdn.net/kangxidagege/article/details/79475537