分类: LINUX
2013-02-18 14:39:47
友情链接: 这是朋友刚开的微店,方便的话帮忙收藏下吧,嘿嘿
网上查了下二维数组做形参的一些知识点,这个网站帮助很大:http://zh200581134.blog.163.com/blog/static/96010202012513101619682/ (呵呵,特别是看到里面的这句话,突然才想到自己的问题可能出在哪了:因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维)
下面是工程中的几个代码段(考虑到公司的利益和程序比较长的原因不好全部黏贴出来)
代码段1:
char buf[64][BUFLEN]; //notice the 64
memset(buf, 0, 64*BUFLEN);
ret = api_getDisks (piccp->di, piccp->si, buf);
代码段2:
u32 api_getDisks(device_id_t di, session_id_t si, char pBuf[14][BUFLEN])
{
...
/* get disk */
getThedisk (pBuf);
...
return ret;
}
代码段3:
static void getThedisk (char ppBuf[][BUFLEN])
{
...
process(npart, kerVer, ppBuf, iofp);
...
}
代码段4:
void process(int n_partitions, int kerVer, char pp_Buf[][BUFLEN], FILE *iofp)
{
...
print_partition_stats(n_partitions, kerVer, pp_Buf);
...
}
代码段5:
void print_partition_stats(int n_partitions, int ncpus, char p_pBuf[18][BUFLEN])
{
...
for (p = 0; p < n_partitions ; p++) //n_partitions is 64
{
sprintf(p_pBuf[p], "%-6s %5.0f %5.0f %6.1f %6.1f %7.1f "
"%7.1f %6.1f %5.1f %6.1f %5.1f %3.0f ",
...
}
...
}
注意上面代码段形参二维数组的传递,用gdb调试程序会发现,代码段5中sprintf会出现段错误,开始一直以为是这个函数里面出问
题了,各种分配内存,加初始化,都不行,搞了很久突然想到一开始给二维数组分配内存的时候,行分配小了(因为n_partitions是64
最开始数组分配的行是14,显然是不行的)
小结:对二维数组作形参这个知识点还不是很清楚导致这个问题出现了不能立刻反应过来,哈哈,要学习啊!
另外,可以如下给二维数组开辟内存:
二维数组动态开辟内存
unsigned int i, j;
char **buf;
buf = (char **)malloc(sizeof(char *) * 18);
for(j = 0;j < 18;j++)
buf[j] = (int *)malloc(sizeof(char) * BUFLEN);
memset(buf, 0, sizeof(char) * BUFLEN);
p_pBuf = buf;
释放
for(j = 0;j<18;j++)
free(buf[j]);
free(buf);
数组开辟
char pBuf[64][BUFLEN];
memset(pBuf, 0, 64*BUFLEN);
p_pBuf = pBuf;