"Запрещенный системный вызов: SYS_socketcall", когда я пытаюсь решить задачу "сумма наибольших n целых чисел в массиве"

Я пытаюсь найти решение для

Совокупность n наибольших целых чисел в массиве целых чисел, где каждое целое число между 0 и 9

int SumNLargest(int* anData, int size, int n)

запрос на вызов программирования, решение, отличное от очевидного, сортировка копии массива и возврат суммы последних 9 элементов. Поэтому я попытался написать линейное решение ниже

#include <iostream>

int SumNLargest(int* anData, int size, int n)
{
// Sum n largest integers in an array of integers where every integer is between 0 and 9
    int cntArr [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for (int i = 0; i < size; ++i) ++cntArr[anData[i]];
    int sum = 0;
    for (int i = size - 1; i >= 0; --i)
    {
        sum += (n - cntArr[i]) >= 0 ?  cntArr[i] * i : n * i;
        --n;
        if (n <= 0) break;
    }   
    return sum;
}


int main()
{
    int myArray [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 12, 15};
    std::cout << SumNLargest(myArray, sizeof(myArray)/sizeof(int), 2);
    return 0;
}

но я получаю сообщение об ошибке

Запрещенный системный вызов: SYS_socketcall

Смотрите: http://codepad.org/UILgXDzQ

Это проблема с моей логикой? Если да, то где? Кроме того, есть ли более элегантное линейное решение, которое я должен был сделать вместо этого?

(И, наконец, я понимаю, что мое решение предполагает n >= size >= 1, но я думаю, что типичное интервью по программированию позволяет мне сделать это предположение, чтобы мне не пришлось тратить время на то, чтобы написать кучу ошибок для неожиданного ввода)

Ответы

Ответ 1

Ваш код вызывает поведение undefined в

 for (int i = 0; i < size; ++i) 
        ++cntArr[anData[i]]; 

когда вы обращаетесь к одиннадцатому элементу (i = 10), потому что cntArr имеет только 10 элементов.
Контроллер памяти, такой как AddressSanitizer, сразу сообщит вам об этом.

Вы не вызываете системный вызов для создания нового сокета, но в результате поведения undefined может случиться что-то.