如果我不说 int i=0 就会出现分段错误
Segmentation Fault if I don't say int i=0
void removeVowels(char* array){
int i,j,v;
i=0;
char vowel[]={'a','e','i','o','u'};
while(array[i]!='[=10=]')
{
for(v=0;v<5;v++)
{
if (array[i]==vowel[v])
{
j=i;
while(array[j]!='[=10=]')
{
array[j]=array[j+1];
j++;
}
i--;
break;
}
}
i++;
}
}
在函数 removeVowels()
中,如果我不包含 i=0
;就说 int i;
为什么会出现分段错误?不是自动0
吗?
完整代码here
Isn't it automatically 0?
不,不是。它 i
具有自动存储功能,因此其默认初始化使其处于未初始化状态,并保留一个不确定的值。在初始化之前读取它是未定义的行为。
在您的代码中,int i
是一个自动局部变量。如果未明确初始化,则该变量所持有的值是不确定的。
因此,在没有显式初始化的情况下,以任何形式使用(读取值)i
,例如 array[i]
调用 undefined behaviour,副作用是分段错误。
Isn't it automatically 0?
不,具有 static 存储 class 的变量将获得此 "facility" 隐式初始化,而不是自动局部变量。
如果您全局声明 int
,则它会以值 0
启动。否则它包含垃圾值。您可以试试下面的代码。
#include<stdio.h>
int global;
int main()
{
int local;
printf("global = %d, local = %d\n", global, local);
return 0;
}
void removeVowels(char* array){
int i,j,v;
i=0;
char vowel[]={'a','e','i','o','u'};
while(array[i]!='[=10=]')
{
for(v=0;v<5;v++)
{
if (array[i]==vowel[v])
{
j=i;
while(array[j]!='[=10=]')
{
array[j]=array[j+1];
j++;
}
i--;
break;
}
}
i++;
}
}
在函数 removeVowels()
中,如果我不包含 i=0
;就说 int i;
为什么会出现分段错误?不是自动0
吗?
完整代码here
Isn't it automatically 0?
不,不是。它 i
具有自动存储功能,因此其默认初始化使其处于未初始化状态,并保留一个不确定的值。在初始化之前读取它是未定义的行为。
在您的代码中,int i
是一个自动局部变量。如果未明确初始化,则该变量所持有的值是不确定的。
因此,在没有显式初始化的情况下,以任何形式使用(读取值)i
,例如 array[i]
调用 undefined behaviour,副作用是分段错误。
Isn't it automatically 0?
不,具有 static 存储 class 的变量将获得此 "facility" 隐式初始化,而不是自动局部变量。
如果您全局声明 int
,则它会以值 0
启动。否则它包含垃圾值。您可以试试下面的代码。
#include<stdio.h>
int global;
int main()
{
int local;
printf("global = %d, local = %d\n", global, local);
return 0;
}