下面哪种动态申请二维数组的方法最优?为什么?

coolness 2009-11-25 07:53:23
1 #include <stdio.h>
2 #include <string.h>
3
4 int main(void)
5 {
6 char **p = NULL;
7 int i;
8
9 p =(char **)malloc(sizeof(char *) * 6);
10 for( i = 0; i < 6; i++) {
11 p[i] = (char *)malloc(sizeof(char) *3);
12 strcpy(p[i], "hel");
13 }
14 for( i = 0; i < 6; i++ ) {
15 printf( "%s\n", p[i] );
16 }
17
18 for( i = 0; i < 6; i++ ) {
19 free(p[i]);
20 p[i] = NULL;
21 }
22
23 free(p);
24 p = NULL;
25 return 0;
26 }
27
28
29 int main(void)
30 {
31 char (*p)[6];
32 int i;
33 char tmp[10] = {"\0"};
34
35 p = (char (*)[6])malloc(3*6);
36 //p = (char *)malloc(3*6);
37 memset( p, '\0', 18);
38 for( i = 0; i < 6; i++){
39 strcpy( p[i], "hel");
40 }
41
42 for( i = 0; i < 6; i++){
43 strcpy(tmp, p[i]);
44 printf( "%s\n", tmp);
45 }
46
47 free(p);
48 p = NULL;
49 return 0;
50 }
51
52 int main(void)
53 {
54 char *array[6];
55
56 int i;
57
58 for( i = 0; i < 6; i++ )
59 {
60 array[i] = (char *)malloc(3);
61 strcpy(array[i], "hel");
62 }
63
64 for(i = 0; i < 6; i++){
65 printf( "%s\n", array[i] );
66 free(array[i]);
67 }
68
69 return 0;
70
71 }
72
...全文
177 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_jialian 2009-11-29
  • 打赏
  • 举报
回复
要设计行数m与列数n都是变量的二维数组,应该这样做
int **p=(int **)malloc(m*sizeof(int *)); /*申请有m个元素的指针数组*/
if(!p) /*申请失败*/
{ ...
}
for(i=0;i<m;i++)
{
p[i]=(int*)malloc(n*sizeof(int)); /*p[i]指向有n个整型元素的数组*/
if(!p[i])
{ ...
}
}
blackboycpp 2009-11-28
  • 打赏
  • 举报
回复
学习。。。
bfdeh 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hitlion2008 的回复:]
直接申请一个一维,这样较好。其实申请二维实际上也是一维.
[/Quote]
同意,一次malloc完!
wumy_ld 2009-11-28
  • 打赏
  • 举报
回复
一次性申请更好。
简洁的就是最好的。
内存分配算法本身在时间和空间上都有不少开销。
selooloo 2009-11-25
  • 打赏
  • 举报
回复
应该是2吧
alexhilton 2009-11-25
  • 打赏
  • 举报
回复
直接申请一个一维,这样较好。其实申请二维实际上也是一维.
coolness 2009-11-25
  • 打赏
  • 举报
回复
我的观点是2>3>1,原因是方法2,malloc和/free分别为一次,3比1小一个malloc/free.请大家讨论。

上面有个小错误。
int main(void)
30 {
31 char (*p)[6];
32 int i;
33 char tmp[10] = {"\0"};
34
35 p = (char (*)[6])malloc(3*6);
36 //p = (char *)malloc(3*6);
37 memset( p, '\0', 18);
38 for( i = 0; i < 3; i++){ // 是3 不是6
39 strcpy( p[i], "hel");
40 }
41
42 for( i = 0; i < 3; i++){ // 是3 不是6
43 strcpy(tmp, p[i]);
44 printf( "%s\n", tmp);
45 }
46
47 free(p);
48 p = NULL;
49 return 0;
50 }
太乙 2009-11-25
  • 打赏
  • 举报
回复
3>2>1
WingForce 2009-11-25
  • 打赏
  • 举报
回复
int main(void)
30 {
31 char (*p)[6];
32 int i;
33 char tmp[10] = {"\0"};
34
35 p = (char (*)[6])malloc(3*6);
36 //p = (char *)malloc(3*6);
37 memset( p, '\0', 18);
38 for( i = 0; i < 6; i++){
39 strcpy( p[i], "hel");
40 }
41
42 for( i = 0; i < 6; i++){
43 strcpy(tmp, p[i]);
44 printf( "%s\n", tmp);
45 }
46
47 free(p);
48 p = NULL;
49 return 0;
50 }


很明显是这个啊,因为只调用了一次函数,呵呵

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧