c处理scanf中的分割错误
我正在编写一个程序,需要我做两个数组的联合。这是我的代码到目前为止。 我得到分割故障为错误后,我进入集合Ac处理scanf中的分割错误
#include <stdio.h>
void Union(int a[], int b[], int set1, int set2)
{
int u[20], i, j, unionIndex=0,trigger;
for(i=0; i<set1; i++)
{
u[unionIndex] = a[i];
unionIndex++;
}
for(i=0; i<set2; i++)
{
trigger=0;
for(j =0; j<set1; j++)
{
if(b[i] == u[j])
{
trigger =1;
break;
}
}
if(trigger =0)
{
u[unionIndex]=b[i];
unionIndex++;
}
}
for(i=0;i<unionIndex;unionIndex++)
{
printf(" %d",u[i]);
}
}
int main(void) {
int N=0;
int M=0;
int i;
int j;
printf("Please enter the number of elements in set A: ");
scanf("%d",N);
int a[N];
printf("Enter the numbers in set: ");
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
printf("Please enter the number of elements in set B: ");
scanf("%d",M);
int b[M];
printf("Enter the numbers in set: ");
for(j=0;i<M;i++)
{
scanf("%d",&b[i]);
}
Union(a,b,N,M);
return 0;
}
我敢肯定,这个问题有什么做的阵列,因为该程序将编译,但我得到了用户进入设置后右边的错误答:我是C初学者,但我对Java有更多的了解,所以我认为这与内存分配有关。我不太清楚如何解决这个问题,所以如果你能指出我的方向是有帮助的。
您需要的变量的地址传递给scanf()
变化
printf("Please enter the number of elements in set A: ");
scanf("%d",N);
到
printf("Please enter the number of elements in set A: ");
scanf("%d", &N);
同去的其他地方
printf("Please enter the number of elements in set B: ");
scanf("%d", &M);
还有另一种可能的错误
它这里
for(j =0; j<set1; j++)
{
if(b[i] == u[j])
在这种set1
等于N
,所以j
会从0 to N-1
。并且数组u[]
只有20
个元素。如果某些用户输入的值超过20
(N
),则可能会出现数组访问限制。
的问题,我看到它是在
scanf("%d",N);
和
scanf("%d",M);
它调用undefined behavior作为scanf()
需要的参数的格式说明符是指向类型。
只是为了澄清,你本质上是通过地址0
(变量的值),无论如何这不是一个有效的地址。
你需要有通过地址,像
scanf("%d", &N);
和
scanf("%d", &M);
这就是说,在你Union()
功能,您使用的是用户定义的值来限制for
环,对照恒定值20
。如果用户输入超过20,则会超出调用undefined behavior的内存。
哦,那么与内存分配无关?那么我会改变标题。谢谢。 – Naman
@Naman是的,没错。它是UB。 –
您得到分段错误的原因是因为您在N
和M
中读取时如何调用scanf
。 %d
格式说明符scanf
预计为int *
,即int的地址,但是您传递的是int
。这是未定义的行为。
这样你就可以解决这些问题是这样的:
scanf("%d",&N);
....
scanf("%d",&M);
一些addtional错误:
当循环中的值来读取b
:
for(j=0;i<M;i++)
{
scanf("%d",&b[i]);
}
你打错循环指标:
for(j=0;j<M;j++)
{
scanf("%d",&b[j]);
}
当检查trigger
:
if(trigger =0)
这是一个任务,而不是一个比较:
if(trigger == 0)
当循环打印出u
:
for(i=0;i<unionIndex;unionIndex++)
你增加了错误的变量:
for(i=0;i<unionIndex;i++)
最后,u
需要有至少set1 + set2
的长度,否则你可能会注销数组的末尾:
int u[set1+set2];
修复这些,你应该得到想要的结果。
这也适用于'M'。 –
@JameyD,我只是编辑.. thanx .. :) – Haris
谢谢! @JameyD – Naman