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完全不同的东西?怎么不能破坏任何碰巧在结构末尾有指针的代码呢? []现在与*?
不同答案 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 *foo
和char foo[]
在某些上下文中(例如函数参数声明)只是相同的事物而不是其他事物(如结构字段声明)。
(我已经很长时间没有攻击C.)