分段错误,如果我不说int i = 0

时间:2015-06-22 18:53:25

标签: c arrays segmentation-fault initialization int

void removeVowels(char* array){
  int i,j,v;
  i=0;

  char vowel[]={'a','e','i','o','u'};
  while(array[i]!='\0')
  {
    for(v=0;v<5;v++)
    {
      if (array[i]==vowel[v])
      {
          j=i;
          while(array[j]!='\0')
          {
            array[j]=array[j+1];
            j++;
          }
          i--;
          break;
      }
    }
    i++;
  }


}

在函数removeVowels()中,如果我不包含i=0;并且只是说int i;为什么它会给出分段错误?是不是自动0

完整代码here

3 个答案:

答案 0 :(得分:5)

  

是不是自动为0?

不,不是。它i具有自动存储功能,因此其默认初始化使其保持未初始化状态,并保持不确定的值。在初始化之前从中读取它是未定义的行为

答案 1 :(得分:0)

在您的代码中,int i是一个自动局部变量。如果未明确初始化,则该变量在不确定性中持有的值。

因此,在没有显式初始化的情况下,以任何形式使用(读取值)i,如array[i]调用undefined behaviour,副作用就是分段错误。

  

是不是自动为0?

不,具有 static 存储类的变量将获得隐式初始化的“设施”,而不是自动局部变量。

答案 2 :(得分:0)

如果您在全局范围内声明int,则会使用值0启动它。否则它包含垃圾值。您可以尝试以下代码。

#include<stdio.h>

int global;

int main()
{
    int local;
    printf("global = %d, local = %d\n", global, local);
    return 0;
}