. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->C/C++语言
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr  数组用起来好像有多个元素。这样合  [待解决] 回复[ 2次 ]   点击[ 625次 ]  
sunshine
[帖 主]   [ 发表时间:2008-09-21 11:58 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr  数组用起来好像有多个元素。这样合法和可移植吗? 


这种技术十分普遍, 尽管 Dennis Ritchie 称之为 ``和C 实现的无保证的亲密接触"。官方的解释认定它没有严格遵守 C 标准, 尽管它看来在所有的实现中都可以工作。仔细检查数组边界的编译器可能会发出警告。

另一种可能是把变长的元素声明为很大, 而不是很小; 在上例中:

    ...
    char namestr[MAXSIZE];

MAXSIZE 比任何可能存储的 name 值都大。但是, 这种技术似乎也不完全符合标准的严格解释。这些 ``亲密'' 结构都必须小心使用, 因为只有程序员知道它的大小, 而编译器却一无所知。

C99 引入了 ``灵活数组域'' 概念, 允许结构的最后一个域省略数组大小。这为类似问题提供了一个圆满的解决方案。
younggay
[第1楼]   [ 回复时间:2008-10-17 09:27 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
我觉的分配新内存,然后将地址赋值给namestr,这样扩大数组的个数,应该没什么吧。不就是将指针给换了个指向么,编译器警告数组越界?但是不合标准不是不合理吧?!
younggay
[第2楼]   [ 回复时间:2008-10-17 09:29 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
C99 引入了 ``灵活数组域'' 概念, 允许结构的最后一个域省略数组大小。
==================
这个方案倒是有点意思,不要要是里面有不只一个数组,而且都要变化咋办咧。呵呵
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved