C灵活数组与指针

时间:2015-12-13 09:59:21

标签: c

var rows = [];
var colStr = null;
for(var j = 0; j <= 10; j++) {
    colStr = "";
  var characters = 'ABCDEFGHIJKLMNOPQRSTUVXYZ';
  for (var i = 0; i <= 10; i++){
      var random = parseInt(Math.random()*characters.length);
      var letter = characters.charAt(random); //returning random letter
      var cell = '<td>' + letter + '</td>';
      colStr += cell;
  };
  rows.push('<tr>' + colStr + '</tr>');
}


document.getElementById('wsBox').innerHTML += rows.join("");

在上面,foo显然是4或8字节长的指针。 bar是一个数组,长3个字节。 baz曾经是一个8字节长的指针。但在C99中,baz是一个灵活的阵列。 (传统上定义为baz [0]。)

有什么规则?编译器如何知道foo是一种与baz完全不同的东西?怎么不能破坏任何碰巧在结构末尾有指针的代码呢? []现在与*?

不同

3 个答案:

答案 0 :(得分:2)

您的结构声明不正确:char foo[];只能显示为最后一个成员,并且最后缺少;。这是正确的声明:

struct ss {
    char *foo;
    char bar[3];
    int bazSize;
    char baz[];
};

我们最后有一个指针foo和一个灵活的数组baz。当从堆中分配这样的结构时,最后一个成员的实际空间必须是已知的,并且如果不重新分配其结构,如果从其他各个地方引用的结构可能很复杂,则不能更改。灵活的阵列可以节省空间,但根本不是灵活

灵活阵列的优点:

  • 节省空间
  • 保存一个间接
  • 一步分配
  • baz永远不会NULL

相反,使baz指针需要单独分配它指向的数组。尺寸,代码和速度的这种缺点伴随着补偿。

指针版本的优点:

  • baz可以NULL指定无数据。
  • 当知道实际大小时,可以按需分配
  • baz
  • baz可以轻松重新分配。

您应该使用哪种方式取决于您如何使用这些结构。使用时的语法是相同的,但编译器已经看到了实际的声明并将生成适当的代码。

答案 1 :(得分:0)

首先,您需要初始化foo和baz以实际编译代码。然后编译器清楚地知道两者之间的区别是什么。

答案 2 :(得分:0)

问题在于char *foochar foo[]在某些上下文中(例如函数参数声明)只是相同的事物而不是其他事物(如结构字段声明)。

(我已经很长时间没有攻击C.)