2015-10-05 8 views
0

код работает до тех пор, пока не достигнет инструкции:код врезается в PRINTF заявлении

printf("%d", sumOccur(input)); 

Код:

#include <stdio.h> 
#include <stdlib.h> 
int sumOccur(int A[]); 

int main(){ 
    int input[6] = {1,1,1,2,2,3}; 
    printf("%d", sumOccur(input)); 
    return 0; 
} 

int sumOccur(int A[]) { 
int sum, i; 
    while(A[i]!='\0'){ 
    sum += A[i]; 
    i++; 
    } 
    return sum; 
} 

Если бы я сделал какие-то глупые ошибки, пожалуйста, обязывать.

+1

Ваша непосредственная проблема заключается в том, что 'i' является неинициализированными, когда вы используете его для индекса массива. Но код имеет больше проблем ... – pmg

+0

Сравнение int с нулевым символом не кажется очень разумным в любом случае. –

+0

@TomTanner Вероятно, что OP видел аналогичную реализацию 'strlen()' или что-то еще, я не знаю, почему, если вы исходите из языка программирования высокого уровня, вы всегда хотите избежать передачи длины массива. –

ответ

3

Это не ошибка printf(). Это sumOccur(). В вашем массиве нет значения \0, поэтому ваше while() никогда не заканчивается, и вы оказываетесь в почти бесконечном цикле и заканчиваете конец массива.

Массив - это массив чисел, а не строка, поэтому нет никакой причины думать, что там будут нулевые терминаторы. null terminators - для строк, а не массивов чисел.

0

Ваш код вызывает неопределенное поведение: доступ A[6] и последующие несуществующие записи в sumOccur пытается найти в массиве окончательный 0, но вы не поставите один в определении input в функции main.

-------- сократить здесь, если вы не заинтересованы в окровавленных деталях реализации --------

массив выделяется в стеке, очень близко к вершине, так как это созданный в функции main. Чтение за пределами конца, пока вы не найдете 0, вероятно, попытается прочитать за пределами страниц стека и вызывает ошибку сегментации.

3

В функции int sumOccur у вас есть два problems-

1.sum и i являются не инициализированы просто объявлены. Инициализируйте оба значения: 0.

2. Также while(A[i]!='\0') не будет работать должным образом, так как ваш массив не имеет этого значения.

+0

Настоящая причина скрывалась на виду! 2. Само по себе не было достаточных оснований для краха. – chqrlie

+0

@chqrlie Да, это правда. – ameyCU

+0

@pradyumna rahul: Еще один иллюстративный случай неправильного использования предупреждений компилятора. Используйте всю помощь, которую компилятор может предоставить вам бесплатно: 'gcc -Wall -W -Werror' или' clang -Weverything' указал бы на ошибку ** 1. **, хотя, вероятно, не ошибка ** 2. ** – chqrlie

0

Вы выполняете итерацию A[i] != '\0', но в массиве нет '\0', а также вы никогда не инициализируете sum, что маловероятно, что причиной аварии может быть.

Вам необходимо пройти количество элементов в массиве, как этот

#include <stdio.h> 
#include <stdlib.h> 

int sumOccur(size_t count, const int *A); 
int sumOccurCHQrlieWay(const int *A, size_t count); 

int main() 
{ 
    int input[] = {1, 1, 1, 2, 2, 3}; 
    printf("%d", sumOccur(sizeof(input)/sizeof(*input), input)); 
    return 0; 
} 

int sumOccur(size_t count, const int *A) 
{ 
    int sum; 
    sum = 0; 
    for (size_t i = 0 ; i < count ; ++i) 
     sum += A[i]; 
    return sum; 
} 

int sumOccurCHQrlieWay(const int *A, size_t count) 
{ 
    return sumOccur(count, A); 
} 
+0

реализация 'sumOccur' является рискованной: она бесполезно предполагает' count> 0'. Эффективная практика заключается в реализации функций полезности с максимально возможными допущениями. – chqrlie

+0

Да абсолютно, но способ, которым я называю это в 'main()', вряд ли произойдет, но вы правы. –

+0

@chqrlie больше нет, я это заметил! –

0

Обратите внимание, что вы имеете дело с Int массив, который означает, что он обычно не будет содержать «\ 0» character.To перебрать массив, нужно указать номер elements.Here правильный путь:

#include <stdio.h> 
#include <stdlib.h> 

int sumOccur(int A[],size_t number_of_elemets); 

int main(){ 

    int input[6] = {1,1,1,2,2,3}; 

    //Get the number of elements 
    size_t n = sizeof(input)/sizeof(int); 

    printf("%d", sumOccur(input,n)); 

    return 0; 
} 

int sumOccur(int A[],size_t number_of_elements) { 

    int sum = 0; 

    size_t i = 0; 

    while(i < number_of_elements) 
    { 
     sum += A[i]; 
     i++; 
    } 
    return sum; 
} 
Смежные вопросы