2016-02-05 10 views
0

Я пишу программу, которая требует от меня объединения двух массивов. Вот мой код до сих пор. я получаю ошибку сегментации как ошибка после того, как я вхожу множество A.Ошибка сегментации в работе c 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, поэтому я думаю, что это имеет какое-то отношение к распределению памяти. Я не совсем уверен, как решить проблему, поэтому, если бы вы могли указать мне в правильном направлении, это было бы полезно.

ответ

1

Вам нужно передать адрес переменной 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.

+1

Это для 'M' тоже. –

+0

@JameyD, я просто редактировал .. thanx .. :) – Haris

+0

Спасибо! @JameyD – Naman

1

Проблема, как я вижу это в

scanf("%d",N); 

и

scanf("%d",M); 

Он вызывает undefined behavior, как scanf() нужен аргумент в формате спецификатор быть указателем на тип.

Чтобы уточнить, вы по существу передаете адрес как 0 (значение переменной), что в любом случае является недействительным.

Вам нужно передать адрес там, как

scanf("%d", &N); 

и

scanf("%d", &M); 

, что сказал, в вашей Union() функции, вы используете определенное пользователем значение, чтобы ограничить цикл for , против постоянного значения 20. В случае, если пользовательский ввод больше 20, вы будете обнулять память, которая вызывает undefined behavior.

+0

О, так что ничего общего с распределением памяти? Тогда я изменю название. Спасибо. – Naman

+0

@Naman Да, правильно. это UB. –

0

Причина, по которой вы получаете ошибку сегментации, связана с тем, как вы звоните scanf при чтении в N и M. Спецификатор формата %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]; 

Fix те, и вы должны получить желаемые результаты.