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)下编译的.
哦,这不是有点危险吗?
不,它们不是可变大小.你只是写过数组的末尾并破坏其他一些内存.没有任何检查可以证明这一点.
将C视为世界上最棒的汇编语言,它也是可移植的.它完全不同于专为内存安全而设计的语言.(这将是大多数其他的.)
你可以回答这样的问题的一种方法(即"C真正做的事情")就是编译cc -S ...并检查生成的汇编代码.即使您不熟悉机器语言,也可以说它没有调用或检查下标范围.
C不可能真的这样做,因为它发生了,因为它x[i]被定义为*(x + i),所以它真的是一种"高级汇编语言",就像他们说的那样.
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |