| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 740 人关注过本帖
标题:[讨论]动态数组~论坛
只看楼主 加入收藏
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
 问题点数:0 回复次数:10 
[讨论]动态数组~论坛

下面的程序是论坛在工藤♀新一的“关于malloc函数~知道的近来看一下哦“的一个回帖~想请教一下
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void)
{
int **p, M, N, i, j;

printf("Enter M: "); /* 第1个下标大小 */
scanf("%d", &M);
printf("Enter N: "); /* 第2个下标大小 */
scanf("%d", &N);

if ((p = (int**)malloc(sizeof(int*) * M)) == NULL) /* 分配第一个下标 */
{
exit(1);
}

for (i = 0; i < N; i++) /* 分配第2个小标 */
{
if((p[i] = (int*)malloc(sizeof(int) * N)) == NULL)
{
exit(1);
}
}

for (i = 0; i < M; i++) /* 输入数据 */
{
for (j = 0; j < N; j++)
{
scanf("%d", &p[i][j]);
}
}

for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
printf("%d ", p[i][j]);
}
putchar('\n');
}

getch();
return 0;
}

如上红色部分~分配第一个下标时为什么要使其返回的值是指针的指针,
我知道在二维数组中如a[ i ][ j ],a[ i ]是表示第i+1行的起始地址,
不知道你这儿使其返回值为**,也是考虑到这个意思?
还有我把
if ((p = (int**)malloc(sizeof(int*) * M)) == NULL) /* 分配第一个下标 */
{
exit(1);
}
这段删掉,程序也能顺利运行,那这段内存申请语句的存在必然性在哪儿?

最后一个问题
我前面也看了一个关于return 0和exit(0)的帖子,在你的程序中把exit(1)改成exit(0)也可以~
我也各自试了exit(0)和exit(1)好像他们的作用一样啊,都是退出当前程序。
我这儿想请教一下:
exit(1)和exit(0)有什么区别?各自在什么情况下使用?
还望各位C爱好者赐教!
畅所欲言!


搜索更多相关主题的帖子: color Enter include 
2006-05-13 11:43
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
得分:0 
论坛大哥进来看看~

come on~~day day up!!
2006-05-13 11:44
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
自己论坛上找,还没找就先问问题,这习惯不好……

对不礼貌的女生收钱......
2006-05-13 11:50
mrsaigp1984
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2006-5-10
收藏
得分:0 
我个人认为是这样的:因为你用的是指向指针的指针,所以它返回的结果就是那样的(即**)
我也是新手,只是个人看法
2006-05-13 12:12
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
得分:0 
soft_wind我是来讨论的~不是来求人给我编程的~

come on~~day day up!!
2006-05-13 12:43
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
还有我把
if ((p = (int**)malloc(sizeof(int*) * M)) == NULL) /* 分配第一个下标 */
{
exit(1);
}
这段删掉,程序也能顺利运行,那这段内存申请语句的存在必然性在哪儿?


这个问题比较深奥,下面的
#include <stdio.h>

int main(void)
{
char *p;

scanf("%s", p);
printf("%s\n", p);

return 0;
}
这个程序为什么也能运行,你知道吗?想想它


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-13 13:12
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
得分:0 
谢谢关注:)
char *p;

scanf("%s", p);
printf("%s\n", p);

如果用%s,那输入就是字符串了阿~输出的时候当然是用%s拉,
从这个里面看不出什么特殊的阿

还有
如果定义一个指针,不管它的类型是什么,如就其本上的值来说就是一个地址(应该就是一个整数把)

在我自己的电脑上用sizeof(),如printf("%d",sizeof(float * ));和printf("%d",sizeof(int * ));
它的值都是2。我想定义了指针的类型只是为了在对指针进行算术运算时有用。
这只是我对指针的一点看法~见笑了:)

come on~~day day up!!
2006-05-13 13:28
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
#include <stdio.h>

int main(void)
{
char *p;

scanf("%s", p);
printf("%s\n", p);

return 0;
}


你先好好看看关于指针的内容,这个程序存在非常严重的错误,最严重情况会让你系统报废,好好看看指针

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-13 13:32
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
得分:0 
哦~知道了~
char *p;
中的指针,没有确定指向那个段内存
如果输入一个值可能覆盖这个不确定的指向的值(也许是指向系统的)

可是在你的程序中不是有
if((p[i] = (int*)malloc(sizeof(int) * N)) == NULL)吗?
这里也是分配一段有用空间啊

我再想想....
谢谢

come on~~day day up!!
2006-05-13 13:40
chernL
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-4-30
收藏
得分:0 
哦~有点明白了~下午去图书馆看看**,
恩~~二维数组,指向指针的指针,再看看
嘿嘿论坛里面的牛人不少阿
谢谢了

come on~~day day up!!
2006-05-13 13:48
快速回复:[讨论]动态数组~论坛
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056711 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved