1

我用 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

4 回答 4

5

因为,通过写入您从未分配的内存,您会导致未定义的行为。有时它有效,有时无效,有时它会让你的狗爆炸。

于 2013-08-16T12:51:34.043 回答
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. 你得到了什么?

当您使用导致“未定义行为”的东西时,会发生这种意外的事情。

于 2013-08-16T13:03:53.540 回答
3

你应该像这样定义数组;

int vet [8];

否则它将调用未定义的行为(在您的程序中就是这种情况),因为没有为vet.
还有循环

for(x=0;x<19;x++)

超出范围,这也会调用未定义的行为。因此应该是

for(x=0;x<8;x++)

main还将定义更改为int main()or int main(void)

于 2013-08-16T12:52:44.473 回答
1

标准 C 甚至不允许零大小的数组,甚至对于可变长度数组也是如此。这是未定义的行为。并且您尝试访问数组边界之外,这是另一个未定义的行为。

换句话说,它可能碰巧在这里工作,它可能不在另一台机器上工作。

于 2013-08-16T12:52:06.263 回答