好奇心与c中的向量

时间:2013-08-16 12:49:54

标签: c vector

我在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函数,如果在这种情况下它没用?为什么我在初始化时会写出向量的维度?

4 个答案:

答案 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甚至不允许零大小的数组,即使对于可变长度数组也是如此。这是未定义的行为。并且您尝试访问数组边界,这是另一种未定义的行为。

换句话说,它可能发生在这里工作,而且它可能无法在另一台机器上工作。