Проблема с функцией, использующей перераспределение, которая, казалось бы, работала 2 недели назад

#c #memory #segmentation-fault

Вопрос:

Итак, простая функция поиска, которая должна возвращать указатель на массив с индексами элементов, соответствующих x, а также вести подсчет с помощью другого указателя — *count. В зависимости от компилятора он просто перестает выполняться, когда я вызываю эту функцию, или возникают ошибки при перераспределении преобразования void в int, и одна из них также привела к ошибке сегментации… Самая запутанная часть заключается в том, что у меня была очень похожая функция в другом проекте, и она работала до сегодняшнего дня(у меня есть доказательства в виде скриншотов, что она работала) и не была затронута.

 int *search(int arr[], int n, int x, int *count)
{
    int arrsize = 0;
    int *pointarr = malloc(sizeof(int));

    for (int i = 0; i < n -1; i  )
    {
        if (arr[i] == x)
        {
            arrsize  ;
            pointarr = realloc(pointarr, sizeof(int) * arrsize);
            pointarr[arrsize - 1] = i;
        }
    }
    *count = arrsize;
    return pointarr;
}
 

Я понимаю, что мой указатель и распределение памяти никогда не были приятными, но это сработало… Я заблудился.

 int main()
{
    int x, n;
    int *tab; // it's later filled no problem as other, simpler function calls it with no problems
    int *tabindex;
    int *count = 0;  //I tried with both =0 and without
   
    //////

    tabindex = search(tab, n, x, count); //I tired with all stuff like amp;count *count etc etc if that's the problem but I don't think so
    for (int j = 0; j < *count; j  )
        printf("%d ", tabindex[j]);
 

Комментарии:

1. int *pointarr = malloc(sizeof(int)); —> int *pointarr = NULL;

2. «преобразование void в int» хм… уверен, что это правильная цитата?

3. i < n -1 хммм… почему -1 ?

4. Чтобы быть строго корректным, вы не должны сохранять значение, возвращенное realloc in pointarr , перед проверкой на значение NULL. В любом случае вам следует проверить наличие NULL раньше pointarr[arrsize - 1] = i; . Тем не менее, я не думаю, что это настоящая проблема здесь

5. Это просто пережиток проверки, не пытался ли я получить доступ к чему-то, к чему я не должен, это не влияет на код прямо сейчас, так как на моем компьютере нет -1.

Ответ №1:

Это происходит потому, что вы компилируете код C с помощью компилятора C . Если вы начали использовать Visual Studio (что является наиболее вероятным вариантом), вам необходимо изменить параметр проекта, чтобы он компилировался как язык C.

введите описание изображения здесь

Комментарии:

1. Сейчас я использую код Visual studio, и в настройках ничего подобного не возвращается, за исключением того, что у меня в правом нижнем углу установлено значение C. Я также ничего не менял и не писал код на C с тех пор, как в последний раз работало то же самое

2. @keiji12, но смысл ясен. Какой компилятор вы используете

3. Я использую gcc, извините, так как я не так хорошо разбираюсь в подобных вещах, я просто установил его некоторое время назад вместе с некоторыми расширениями в студийном коде для одного семестра лабораторных работ и ничего не изменил после этого