renjiewen1995
renjiewen1995
2016-09-03 04:31
采纳率: 0%
浏览 2.5k

关于memset的使用,导致内存访问冲突,是何原因

以下这段c++程序会发生内存访问冲突,但是将memset( visited, false, sizeof(bool) * (n+1) );去掉,就会解决问题,求教高手为什么?

in.txt:
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0

#include
#include
#include
#include

using namespace std;

void DFS( int ** data, int begin, int size, bool * visited)
{
if( visited[begin] == true )
{
return;
}else
{
visited[begin] = true;
}
for( int i = 1; i< size +1; i ++)
{
if( data[begin][i] == 1 )
{
DFS( data, i , size,visited) ;
}
}
}
int main()
{
freopen( "in.txt","r",stdin);
int n = 0;
int m = 0;
int **data = NULL;
while( cin>>n>>m && n != 0 )
{
data = new int*[n+1];
for( int i = 0;i < n+1; i++)
{
data[i] = new int[n+1];
}
memset( data, 0, sizeof(int) * (n+1) * (n+1) );
int r = 0,c = 0;
for( int k = 0; k < m ; k++)
{
cin>>r>>c;
data[r][c] = 1;
}
if( m < n-1 )
{
cout<<"NO\n";
continue;
}
bool *visited = new bool[n+1];
memset( visited, false, sizeof(bool) * (n+1) );
DFS( data,1, n, visited);
int flag = 1;
for( int k = 1 ; k< n+1; k++)
{
if( visited[k] == false )
{
flag = 0;
break;
}
}
if( flag == 0 )
{
cout<<"NO\n";
continue;
}
else
cout<<"YES\n";
}
}

题目描述:
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入:
每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。
输出:
对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • shihengzhen101
    AlbertS 2016-09-03 05:34

    你把false换成0试试

    点赞 评论
  • hijack00
    hijack00 2016-09-04 10:11

    你说的内存访问冲突不是直接由那句引起的,我把

    bool *visited = new bool[n+1];
    memset(visited, false, sizeof(bool) * (n+1));
    

    这两句复制到我的代码中编译运行都没有任何问题。

    点赞 评论
  • C20180630
    C20180630_zjf 2016-09-05 05:35

    把memset更改一下

    点赞 评论

相关推荐