与数组匹配会导致分段错误

时间:2012-12-25 15:15:16

标签: c arrays

来自此代码,

node[4] = {5,3,2,6};  
neighbor[4] = {4,7,8,9};

我必须找到,

  • node[0]node[1]具有来自neighbor[0-3]
  • 的任何常见值
  • node[1]node[2]具有neighbor[0-3]
  • 的任何常用值
  • node[2]和节点[3]具有neighbor[0-3]
  • 的任何常用值

如果有人满足打印元素,则不是......左右 我试过这段代码,但是有错误状态分段错误。

#include<stdio.h>

int main()
{
    int node[4] = {5,3,2,6};
    int neighbor[4] = {4,3,2,9};
    int sub,i,flag=0,k=0;

    for (k=0;k<3;k++){
        for (i = 0; i < 4; i++) {
            if (node[k]==neighbor[i])
                flag=1;
            break;
        }
    }
    if (flag==1)
        sub=k+1;
    for (i = 0; i < 4; i++) {
        if (node[sub]==neighbor[i])
            flag=2;
        break;
    }
    if (flag==2)
        printf("Element not found\n");
    else
        printf("Element  found\n");
}

3 个答案:

答案 0 :(得分:3)

您正在访问数组的界限。

sub=k+1;

使用此功能,将k设置为4,然后在后续循环中访问node[sub]。只有0到3是node的有效索引。


访问越界内存是未定义的行为。你可能想要摆脱两个循环。

    for (k=0;k<3;k++){
        for (i = 0; i < 4; i++) {
            if (node[k]==neighbor[i])
            {
              flag=1;
              break;
            }
            if (flag == 1) break;
        }
    }

    if (flag==1) {
       sub=k+1;
       for (i = 0; i < 4 && sub < 4; i++) 
       {
            if (node[sub]==neighbor[i]) 
            {
              flag=2;
              break;
            }
      }
   }

注意for循环中的条件:sub < 4以确保您不会访问越界。


#include<stdio.h>

int present(int x, int y, int N[])
{
  int i, c=0;
  for(i=0;i<4;i++)
  {
      if(N[i]==x) c++;
      if(N[i]==y) c++;
  }
  if (c==2) return 1;
  return 0;
}

int main()
{
    int node[4] = {5,3,2,6};
    int neighbor[4] = {4,8,2,9};
    int sub,i,flag=0,k=0;

    for (k=0;k<3;k++){
        if (present(node[k], node[k+1], neighbor)) {
           flag = 1;
           printf("Element found");
           break;
        }
    }
    if(flag == 0) 
       printf("Element not found");

    return 0;
}

答案 1 :(得分:1)

sub未定义/未设置,以防flag永远不会设置为1,因此您基本上使用未初始化的值作为索引,从而导致您的程序从它指向的任何地方。

答案 2 :(得分:0)

以下是完整的解决方案:

#include <stdio.h>
int main()
{
    int node[4] = {5,3,2,6};
    int neighbor[4] = {4,3,2,9};
    int i=0,j=0,k=0;

    for (i=0; i<4; i++) {
        for (j=0; j<4; j++) {
            if (node[i]==neighbor[j]) {
                for (k=0; k<4; k++) {
                    if (node[i+1]==neighbor[k]) {
                        printf("Element found: %d %d\n", node[i], node[i+1]);
                        return 0;
                    }
                }
            }
        }
    }
    printf("Element not found\n");
    return 0;
}