我在C中编写了一个小程序,我期望向量出错。
#include <stdlib.h>
#include <stdio.h>
main(){
int vet[0];
vet[0] = 1;
vet[1] = 2;
vet[2] = 2;
vet[3] = 2;
vet[4] = 2;
vet[5] = 2;
vet[6] = 2;
vet[7] = 2;
int x;
for(x=0;x<19;x++) printf("%d\n", vet[x]);
system("pause");
}
在编写这段代码之前,我认为要在向量中添加一个元素,而且他的大小,我应该调用malloc
函数,但后来我发现没有malloc
函数代码也可以精细。所以我的问题是,为什么我应该使用malloc函数,如果在这种情况下它没用?为什么我在初始化时会写出向量的维度?
答案 0 :(得分:5)
因为通过写入您从未分配的内存,您将导致未定义的行为。有时它会起作用,有时却不起作用,有时它会使你的狗爆炸。
答案 1 :(得分:3)
你应该定义数组;
int vet [8];
否则它会调用未定义的行为(程序就是这种情况),因为没有为vet
分配内存。
还有循环
for(x=0;x<19;x++)
超出界限,也会调用未定义的行为。因此它应该是
for(x=0;x<8;x++)
同时将main
定义更改为int main()
或int main(void)
。
答案 2 :(得分:3)
这很可爱,但让我们通过添加另一个这样的“矢量”来改变程序:
#include <stdio.h>
int main(void){
int vet[0];
int vex[0];
vet[0] = 1;
vet[1] = 2;
vet[2] = 2;
vet[3] = 2;
vex[0] = 3;
vex[1] = 3;
vex[2] = 3;
vex[3] = 3;
int x;
for(x=0;x<4;x++) printf("%d\n", vet[x]);
}
我猜你可以期待程序打印1 2 2 2
。我实际得到1 3 2 3
。你得到了什么?
当您使用导致“未定义行为”的内容时,会发生类似意外的事情。
答案 3 :(得分:1)
标准C甚至不允许零大小的数组,即使对于可变长度数组也是如此。这是未定义的行为。并且您尝试访问数组边界,这是另一种未定义的行为。
换句话说,它可能发生在这里工作,而且它可能无法在另一台机器上工作。