【问题标题】:Segmentation Fault if I don't say int i=0如果我不说 int i=0,则出现分段错误
【发布时间】:2015-06-22 18:53:25
【问题描述】:
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++;
  }


}

如果我不包含i=0,则在函数removeVowels()中;就说int i;为什么会出现分段错误?不是自动0吗?

完整代码here

【问题讨论】:

    标签: c arrays segmentation-fault initialization int


    【解决方案1】:

    不是自动为0吗?

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

    【讨论】:

      【解决方案2】:

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

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

      不是自动为0吗?

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

      【讨论】:

        【解决方案3】:

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

        #include<stdio.h>
        
        int global;
        
        int main()
        {
            int local;
            printf("global = %d, local = %d\n", global, local);
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 2020-10-26
          相关资源
          最近更新 更多