关于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个回答

你把false换成0试试

renjiewen1995
无产阶级劳苦大众之一 不是说这个原因,还是感谢了
大约 4 年之前 回复

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

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

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

coding_hello
野男孩 回复肌肉杰: 恩,你定义的是int ** data; 然后分配内存的时候,是先new了int*指针,然后给每个指针new内存块,这些内存卡并不连续。应该直接定义成int* data; 然后data = new int[n*m];
大约 4 年之前 回复
hijack00
hijack00 对new不是很了解,但是malloc这类函数申请空间的时候都是申请连续的内存,若没有连续内存会返回NULL,也就是申请失败。对于二维数组,每行对应的存储空间应该也是连续的,不过行与行之间的存储空间确实不一定是连续的。但是你可以new一个(n+1)*(n+1)的连续空间,然后将其指针强制类型转换为一个二维数组或者二维指针,这样就是连续的
大约 4 年之前 回复
renjiewen1995
无产阶级劳苦大众之一 问题解决了,是memset( data, 0, sizeof(int) * (n+1) * (n+1) );这一句的问题。我认为是因为data用new给每一个行向量申请内存空间时,内存区域不连续造成的,如果直接memset,会把不属于data的空间set成0,如果静态定义data就好了。
大约 4 年之前 回复

把memset更改一下

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐