程序崩溃 - 分段错误

时间:2017-02-09 13:10:46

标签: c segmentation-fault

我的代码

int i,v,o,p,j;
v=0;
o=0;
char x[12]={'#','v','v','o','#','o','v','#','v','o','o','#'};
void vukovi (char a[])
{
    for (i=0;i<12;i++){
        if (x[i]=='#'){
            for (j=i+1;x[j]!='#';j++){
                if (x[j]=='v'){
                    v=v+1;
                }
                if (x[j]=='o')
                    o=o+1;
            }

            if (v>=o){
                for (j=i+1;x[j]!='#';j++){
                    if (x[j]=='o'){
                        x[j]='.';
                    }
                }
            }

        }
        v=0;
        o=0;
    }

for (i=0;i<12;i++){
    printf("%c",x[i]);
    }
}
vukovi(x);
return 0;}

有时打印效果很好 有时错误

  

.exe停止工作

我不知道为什么。
计划的理念是:两个#之间的任何地方v&gt; oo必须替换为.
就像我在打印时说的那样,打印效果很好 否则错误。帮忙?
(我遗漏了包含和主要功能)。

2 个答案:

答案 0 :(得分:5)

i==11此循环错误时:

for (j=i+1;x[j]!='#';j++){

因为它使得j从12开始。你已经在字符串之外了,但是因为你的循环在#上停止了,所以在树林中向前推进:未定义的行为。

如果在通过未分配的内存(可能发生或不发生)时遇到#字符,或者遇到超出系统检测到非法读取的页面边界而停止使用SEGV时,它会停止。

答案 1 :(得分:0)

你所面对的是Segmentation Fault 您正在访问您不应该访问的内存。

您的本部分代码:

for (i=0;i<12;i++){          //Till i<12, that means when i = 11 loop will run.
        if (x[i]=='#'){
            for (j=i+1;x[j]!='#';j++){  //j =  i+1, for i = 11, j = 12
                if (x[j]=='v'){         
                    v=v+1;
                }
                if (x[j]=='o')
                    o=o+1;
            }

            if (v>=o){
             for (j=i+1;x[j]!='#';j++){  //j =  i+1, for i = 11, j = 12
               if (x[j]=='o'){         //x[j] , for j = 12 , x[12]
                x[j]='.';  //x[12] = '.' You Are Accessing Memory You Are Not Supposed to.
                    }
                }
            }

你不应该访问数组,它有很多风险 请参阅此问题How dangerous is it to access an array out of bounds?,我强烈推荐。