2016-04-04 6 views
-1

Я работаю над проектом, который требует, чтобы я читал пользовательские входы как пары целых чисел, а затем сохранял их в массиве. Итак, я создал функцию, которая делает это. Тем не менее, я почему-то получаю ошибку сегментации каждый раз, когда вводится последний ввод. Вот мой код:Индексирование массива в C возвращает ошибку сегментации

int userInput(int *arrayPtr){ 

    int numberPairs, i, numberElements; 
    printf("%d", sizeof(int)); 

    printf("How many pairs of integers? "); 
    scanf("%d", &numberPairs); 
    numberElements = numberPairs*2; 
    arrayPtr = malloc((numberElements*sizeof(int)) + 64); 

    for(i = 0; i < numberElements; i+=2){ 
     int first,second; 
     printf("\nEnter pair: "); 
     printf("Before scanf"); 
     scanf("%d %d", &first, &second); 
     printf("%d", first); 
     arrayPtr[i] = first; 
     arrayPtr[i+1] = second; 
    } 
    printf("%d", numberPairs); 

    return numberPairs; 
} 

Вот как я вызываю функцию:

int main(){ 
    int *arrayPtr, numberPairs; 
    numberPairs = userInput(arrayPtr); 
    multiplyPairs(arrayPtr, numberPairs); 
    free(arrayPtr); 
} 

В настоящее время я в основном пытаюсь сделать цикл выполнения в полном объеме, но по каким-то причинам всегда seg ошибок на последней итерации. Например, если мой ввод для пар был 1 2, 3 4, 5 6, мой выход был бы 1 3, а затем - сбой (этот вывод относится к заявлению печати в цикле for). Я потратил несколько часов, пытаясь отладить этот код, а также взглянуть на него другими учениками, и я не могу понять, что не так. Если бы вы могли указать мне в правильном направлении, я был бы очень признателен. Благодарю.

UPDATE: Я скопировал и вставил код в новый файл, и он работает по назначению. Спасибо всем, кто рассказал мне о других элементах моего кода, которые были неправильными.

+1

Вы передаете 'int *' в эту функцию, а затем ожидаете, что она укажет на массив, выделенный этой функцией? 'arrayPtr = ...' полностью отделяет 'arrayPtr' от того, что передал вызывающий. – user2357112

+0

Я не передаю никакой информации указателем массива. Я просто объявляю его в своей основной функции, чтобы он имел надлежащий охват. Потому что я использую тот же arrayPtr, что и параметры для других функций. –

+1

Покажите, как вы вызываете функцию. [Читать это] (http://stackoverflow.com/help/mcve). –

ответ

1

Вам нужно это:

int userInput(int **arrayPtr){ 

    int numberPairs, i, numberElements; 
    printf("%d", sizeof(int)); 

    printf("How many pairs of integers? "); 
    scanf("%d", &numberPairs); 
    numberElements = numberPairs*2; 
    *arrayPtr = malloc((numberElements*sizeof(int)) + 64); 

    for(i = 0; i < numberElements; i+=2){ 
     int first,second; 
     printf("\nEnter pair: "); 
     printf("Before scanf"); 
     scanf("%d %d", &first, &second); 
     printf("%d", first); 
     (*arrayPtr)[i] = first; 
     (*arrayPtr)[i+1] = second; 
    } 
    printf("%d", numberPairs); 

    return numberPairs; 
} 


int main(){ 
    int *arrayPtr, numberPairs; 
    numberPairs = userInput(&arrayPtr); 
    multiplyPairs(arrayPtr, numberPairs); 
    free(arrayPtr); 
} 

Объяснения с помощью очень простого примера

Вы хотите написать функцию, которая mutiplies первый с его вторым аргументом и сохраняет значение в третьем agrument.

Так вы попробуете это:

void Multiply(int a, int b, int r) 
{ 
    r = a * b; 
} 

int main(){ 
    int result = 0; 
    Multiply(3, 4, result); 
    printf ("result = %d\n", result); 
    return 0; 
} 

И вы ожидаете выход result = 12. Но вы получаете result = 0. Причина в том, что при изменении параметра функции аргумент функции вызывающего абонента не будет изменен, поскольку параметры передаются по значению (это похоже на C и на большинстве других языков программирования). BTW, что должно произойти, если вы не передаете переменную как третий аргумент, а константу: например, Multiply(3, 4, 5);?

Если вы хотите, чтобы ваша функция, чтобы изменить параметр, вы должны пройти указатель на аргумент fonction и изменить заостренный значение в функции:

Следующий пример показывает, что делать:

void Multiply(int a, int b, int *r) 
{ 
// r points to the variable passed as third argument 
    *r = a * b; 
} 

int main(){ 
    int result = 0; 

    // here we pass the pointer to result 
    Multiply(3, 4, &result); 

    printf ("result = %d\n", result); 
    return 0; 
} 
Смежные вопросы