C上的数组是否可变长度?

use*_*327 4 c arrays gcc memory-management

我试图制作一个基于数组的线性列表,然后我编译了这个:

char size = 0;
char testarray[10];

int main() { 
    add('a'); add('b'); add('c');
    add('d'); add('e'); add('f');
    add('g'); add('h'); add('i');
    add('j'); add('k'); add('l');
    add('m'); add('n'); add('o');
    print();
    return 0;
} 

void add(char newchar) {
    testarray[++size] = newchar;
}

void print() {
    char i = 0;
    for (i = 0; i <= size; i++) {
        printf("%c ", testarray[i]);
    }
 }
Run Code Online (Sandbox Code Playgroud)

编译它,gcc arraytest.c但阵列工作得很好.这是否意味着默认情况下数组是可变长度的?我认为这是一个仅限C99的功能.

它是在Gentoo(gcc version 4.5.3 (Gentoo 4.5.3-r2 p1.1, pie-0.4.7)和Ubuntu(gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)下编译的.

哦,这不是有点危险吗?

Vau*_*ato 7

不,它们不是可变大小.你只是写过数组的末尾并破坏其他一些内存.没有任何检查可以证明这一点.

  • ......他正在造成不明确的行为,这意味着任何事情都可能发生,从出现工作到点燃气氛到用信用卡购买披萨. (5认同)

Dig*_*oss 5

没有


将C视为世界上最棒的汇编语言,它也是可移植的.它完全不同于专为内存安全而设计的语言.(这将是大多数其他的.)

你可以回答这样的问题的一种方法(即"C真正做的事情")就是编译cc -S ...并检查生成的汇编代码.即使您不熟悉机器语言,也可以说它没有调用或检查下标范围.

C不可能真的这样做,因为它发生了,因为它x[i]被定义为*(x + i),所以它真的是一种"高级汇编语言",就像他们说的那样.