变长数组参数一问

LoveCreatesBeauty 2006-03-31 03:19:33
#include <stdio.h>

void foo(int size_x, int size_y, int tab[size_x][size_y])
{
printf("tab: %d\n", tab[1][1]);
}

int main()
{
int tab[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};

foo(0, 0, tab);
foo(1, 1, tab);
foo(2, 2, tab);
foo(3, 3, tab);

return 0;
}



/*

程序可能输出如下:

tab: 1
tab: 2
tab: 3
tab: 4


1、请解释结果是否正确,为什么;

2、foo(3, 3, tab); 函数调用中,是否非法引用了数组以外的元素;

3、四次函数调用:

foo(0, 0, tab);
foo(1, 1, tab);
foo(2, 2, tab);
foo(3, 3, tab);

在函数体 foo() 中,每一次,指针 tab 引用的分别是位于 int tab[9]; 数组中的第几个元素。

4、续上一题目[3]。四次函数调用,在函数体 foo() 中,每一次,tab[0][0] 引用的分别是位于 int tab[9]; 数组中的第几个元素。

*/
...全文
233 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveCreatesBeauty 2006-04-02
  • 打赏
  • 举报
回复
以下为我的原帖中的两处,都引发未定义行为。

> foo(0, 0, tab);

定义数组时的元素个数不能为零。

> foo(1, 1, tab);

使函数调用 printf("tab: %d\n", tab[1][1]); 为未定义行为。
LoveCreatesBeauty 2006-04-01
  • 打赏
  • 举报
回复
--- quoting ---
goodluckyxl(被人遗忘的狗) ( ) 信誉:161 2006-03-31 16:18:00 得分: 0

<snip>

你只要告诉他C99中新增添了动态数组就可以了
--- quoting ends ---


"动态数组"? 不会再跟malloc分配数组混在一起吧。

好一点的名字是变长数组,或干脆用variable-length array。

狗狗,我对你的C语言极之不满意。然后你又说,写驱动不是你的长项,但你能做好吧。嘻嘻。
LoveCreatesBeauty 2006-04-01
  • 打赏
  • 举报
回复
> 大家都是出来混的,语言这个层面的东西没有好值得吹嘘的。。。

我的意见是:什么事情都不能吹嘘。
LoveCreatesBeauty 2006-04-01
  • 打赏
  • 举报
回复
--- quoting ---
goodluckyxl(被人遗忘的狗) ( ) 信誉:161 2006-03-31 16:06:00 得分: 0

<snip>

//替代你的foo使用如下
printf("pp0: %d\n", pp0[1]);
printf("pp1: %d\n", pp1[1][1]);
printf("pp2: %d\n", pp2[1][1]);
printf("pp3: %d\n", pp3[1][1]);
printf("\n");
//实际转换后意思如下
printf("pp0: %d\n", tab[1+0/sizeof(int)]);
printf("pp1: %d\n", tab[1+sizeof(int[1])/sizeof(int)]);
printf("pp2: %d\n", tab[1+sizeof(int[2])/sizeof(int)]);
printf("pp3: %d\n", tab[1+sizeof(int[3])/sizeof(int)]);
return 0;
}
--- quoting ---


I just do not understand your example here.

Someone gives me other description on it, now I know the things now.

For your information: http://spaces.msn.com/lovecreatesbeauty/blog/cns!F8F640E9473C03F4!646.entry
goodluckyxl 2006-04-01
  • 打赏
  • 举报
回复
我知道自己水平一般般,没办法所以还在学习
VLA作为数组进行参数传递时基本实质没有变化
所以解答的时候也是直接拿旧示例程序本以为你能看懂
没有嘲笑你的意思,我觉得你水平在我之上应该能看懂我表达意思很遗憾
日志上的解答可能是我英文比较差实在没看出有超出我给出答案之外解释
另外 动态数组是我自己意译原因就不叙述了,可能不符合大多数人的概念
我更正一下我的用语:国内译成变长数组或可变数组 英文简称VLA



goodluckyxl 2006-04-01
  • 打赏
  • 举报
回复
没关系 我下个礼拜一加你
家里上不了msn
不用道歉你没有啥问题 讨论问题没有什么对错
大家互相切磋 我也是半瓶的水平
LoveCreatesBeauty 2006-04-01
  • 打赏
  • 举报
回复
谢谢你。在帖子你给你道歉了。

你的C语言水平比我好的多。以后有问题都能得到你的帮助就好了。

我的msn是 lovecreatesbeauty@hotmail.com ,可以告诉你的msn,加你到msn联系人里吗。
LoveCreatesBeauty 2006-04-01
  • 打赏
  • 举报
回复
--- 引用 ---
goodluckyxl(被人遗忘的狗) ( ) 信誉:161 2006-04-01 12:26:00 得分: 0

我知道自己水平一般般,没办法所以还在学习
VLA作为数组进行参数传递时基本实质没有变化
所以解答的时候也是直接拿旧示例程序本以为你能看懂
没有嘲笑你的意思,我觉得你水平在我之上应该能看懂我表达意思很遗憾
日志上的解答可能是我英文比较差实在没看出有超出我给出答案之外解释
另外 动态数组是我自己意译原因就不叙述了,可能不符合大多数人的概念
我更正一下我的用语:国内译成变长数组或可变数组 英文简称VLA
--- 引用结束 ---



goodluckyxl,对不起。

我理解错了。我再次认真阅读了你的回复,认为你的解释是正确的,也是很清楚聪明的(相对于我来说)。

谢谢你的帮助。
duduhaha 2006-03-31
  • 打赏
  • 举报
回复
大家都是出来混的,语言这个层面的东西没有好值得吹嘘的。。。
cwowlonglong 2006-03-31
  • 打赏
  • 举报
回复
<97 hpunix:/oracle/home/teng/test>aCC test.c
Error 176: "test.c", line 3 # Size of array must be an integral constant
expression of value greater than 0.
void foo(int size_x, int size_y, int tab[size_x][size_y])
^^^^^^
Error 176: "test.c", line 3 # Size of array must be an integral constant
expression of value greater than 0.
void foo(int size_x, int size_y, int tab[size_x][size_y])
^^^^^^
Error 212: "test.c", line 12 # Argument type 'int [9]' does not match expected
parameter type 'int (*)[1]'.
foo(0, 0, tab);
^^^
Error 212: "test.c", line 13 # Argument type 'int [9]' does not match expected
parameter type 'int (*)[1]'.
foo(1, 1, tab);
^^^
Error 212: "test.c", line 14 # Argument type 'int [9]' does not match expected
parameter type 'int (*)[1]'.
foo(2, 2, tab);
^^^
Error 212: "test.c", line 15 # Argument type 'int [9]' does not match expected
parameter type 'int (*)[1]'.
foo(3, 3, tab);
goodluckyxl 2006-03-31
  • 打赏
  • 举报
回复
二维数组我们只要知道后面的列数而不需要行
int(*)[X]呢就是一种类型 列为X列的二维数组类型
能不能理解?
oooooa1 2006-03-31
  • 打赏
  • 举报
回复
我是菜鸟...楼上高手能不能解释下这段代码什么意思?
int *pp0 = tab;
int (*pp1)[1] = (int(*)[1]) tab;
int (*pp2)[2] = (int(*)[2]) tab;
int (*pp3)[3] = (int(*)[3]) tab;
goodluckyxl 2006-03-31
  • 打赏
  • 举报
回复
都是来切磋的
有些兄弟某些方面不了解
没必要横加指责
你只要告诉他C99中新增添了动态数组就可以了
goodluckyxl 2006-03-31
  • 打赏
  • 举报
回复
#include <stdio.h>


int main()
{
int tab[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int *pp0 = tab;
int (*pp1)[1] = (int(*)[1]) tab;
int (*pp2)[2] = (int(*)[2]) tab;
int (*pp3)[3] = (int(*)[3]) tab;
//替代你的foo使用如下
printf("pp0: %d\n", pp0[1]);
printf("pp1: %d\n", pp1[1][1]);
printf("pp2: %d\n", pp2[1][1]);
printf("pp3: %d\n", pp3[1][1]);
printf("\n");
//实际转换后意思如下
printf("pp0: %d\n", tab[1+0/sizeof(int)]);
printf("pp1: %d\n", tab[1+sizeof(int[1])/sizeof(int)]);
printf("pp2: %d\n", tab[1+sizeof(int[2])/sizeof(int)]);
printf("pp3: %d\n", tab[1+sizeof(int[3])/sizeof(int)]);
return 0;
}
LoveCreatesBeauty 2006-03-31
  • 打赏
  • 举报
回复
> vc下,编译不通过...

C/C++不只是VC,这是C版块,不是VC版块。我只能说这是合法的C程序,完全可以在符合标准的编译器下编译成功。


> c是不支持动态数组的

好好回去看书吧。不要信口开河,请为这个论坛保持一定的信噪比。
jinjiajie 2006-03-31
  • 打赏
  • 举报
回复
vc下,编译不通过...c是不支持动态数组的,因此foo(int size_x, int size_y, int tab[size_x][size_y])
一般是通过不了编译

69,373

社区成员

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

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