免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19716 | 回复: 12
打印 上一主题 下一主题

请教 int array[0]; 是什么意思 ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-12 12:40 |只看该作者 |倒序浏览
请教  int array[0];  是什么意思 ?

我试验了一下,  *array = 1 ;还是正确的
但是 sizeof(array) == 0;

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-11-12 12:51 |只看该作者
做一个地址标记,以后用。

论坛徽章:
0
3 [报告]
发表于 2006-11-12 13:00 |只看该作者
原帖由 aero 于 2006-11-12 12:51 发表
做一个地址标记,以后用。


关键是内存是如何分配的呢 ?
我发现把内存接着往下用两三个int变量的空间是没有问题的
用到什么时候会出问题呢 ?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-11-12 13:43 |只看该作者
原帖由 yeajchao 于 2006-11-12 13:00 发表


关键是内存是如何分配的呢 ?
我发现把内存接着往下用两三个int变量的空间是没有问题的
用到什么时候会出问题呢 ?


你往下写一个内存也是错误的!

内存空间根本就没开辟。

使用的时候开辟。往往在大项目中两个模块中需要接口的数据结构的强制类型转换中使用。

比如,在你的模块中有如下数据结构:

  1. struct sub_moudle {
  2.         struct sub_moudle        *next;
  3.         /******************
  4.          * any useful info.       *
  5.          ******************/
  6. };
复制代码


这个数据结构构成一个单链表。当你对这个单链表进行add、modify、del的时候,你当然想使用通用的单链表操作例程来做。

这个时候,可以把单链表节点定义为:

  1. struct node {
  2.         struct node        *next;
  3.         char                   user_info[0];
  4. };
复制代码


然后,用node这个数据结构来写单链表的add、modify、del。

这样,在用标准例程来操作sub_module这个链表的时候,也随时可以通过user_info来得到原来的useful info。

当然,这只是一种应用而已。我说得也不太清楚。接触过就知道了。^_^。

论坛徽章:
0
5 [报告]
发表于 2006-11-12 13:51 |只看该作者
谢谢,但是我仍然有疑惑



但是我的如下代码是能顺利编译且不出警告和错误,而且能运行的啊

int array[0]

*array = 1;
printf("%d\n",*array);//输出的结果就是 1

int *p;
p = array
P++;
*p = 2;
printf("%d",*p);这些都是能编译执行的

而 C 中,下面的代码是要  core dump的
int *p;
*p = 1;//core dump


还有,int user_info[0];  与 int *user_info  有什么区别呢 ?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-11-12 13:54 |只看该作者
当然没有错误啦。

写越界是程序员的错误,不是计算机的错误。

C给程序员最大的自由,允许你做任何事。她不会给你任何保护。所以C的程序才最容易dump。

C程序员,一定要清楚计算机是怎么运行的。

机器把自由都给了你,你要好好对待她哦~

论坛徽章:
0
7 [报告]
发表于 2006-11-12 16:03 |只看该作者
在标准 C 或者 C++ 中由于不支持 0 长度的数组,所以 int array[0]; 这样的定义是非法的。不过有些编译器的扩展功能支持 0 长度的数组。

在 C 中,0 长度的数组的主要用途是用来作为结构体的最后一个成员,然后用它来访问此结构体对象之后的一段内存(通常是动态分配的内存)。由于其非标准性,在程序中尽量避免使用 0 长度的数组。作为替换,可以使用 C99 标准中的不完整数组来替换 0 长度的数组定义。如:
  1. struct X {
  2.   /* Members */
  3.   int array[]; /* Do not write int array[0]; since it is not standard. */
  4. };
复制代码

>> 但是我的如下代码是能顺利编译且不出警告和错误,而且能运行的啊
>> int array[0]
>> *array = 1;

程序中可能出现的错误有多种。一是语法错误,这类错误很容易在编译阶段检查出来。除此之外,还有一类错误在编译阶段不能或者很难检查出来,这类错误被称为“无定义”,其结果是不确定的。

上面的代码中因为有越界访问数组这一错误存在,所以它的行为(执行的结果)是无定义的。

论坛徽章:
0
8 [报告]
发表于 2006-11-12 18:00 |只看该作者
应用比如:


  1. struct A {
  2.     int  a, b;
  3.     char data[0];
  4.     /* do not write fields below */
  5. };

  6. struct A *p;

  7. int n = 100, i;
  8. p = malloc(sizeof(struct A) + n);
  9. for (i = 0; i < n; ++i)
  10.     p->data[i] = 1;

复制代码

论坛徽章:
0
9 [报告]
发表于 2006-11-12 22:39 |只看该作者
在C++中此写法不一定能够得到上述结果,应该避免如此使用。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-11-12 23:00 |只看该作者
原帖由 whyglinux 于 2006-11-12 16:03 发表
在标准 C 或者 C++ 中由于不支持 0 长度的数组,所以 int array[0]; 这样的定义是非法的。不过有些编译器的扩展功能支持 0 长度的数组。

在 C 中,0 长度的数组的主要用途是用来作为结构体的最后一个成员,然后 ...


是非法的吗?我用gcc -std=c89只是得到了一个未使用的warning啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP