#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
inpointarr
, перед проверкой на значение NULL. В любом случае вам следует проверить наличие NULL раньшеpointarr[arrsize - 1] = i;
. Тем не менее, я не думаю, что это настоящая проблема здесь5. Это просто пережиток проверки, не пытался ли я получить доступ к чему-то, к чему я не должен, это не влияет на код прямо сейчас, так как на моем компьютере нет -1.
Ответ №1:
Это происходит потому, что вы компилируете код C с помощью компилятора C . Если вы начали использовать Visual Studio (что является наиболее вероятным вариантом), вам необходимо изменить параметр проекта, чтобы он компилировался как язык C.
Комментарии:
1. Сейчас я использую код Visual studio, и в настройках ничего подобного не возвращается, за исключением того, что у меня в правом нижнем углу установлено значение C. Я также ничего не менял и не писал код на C с тех пор, как в последний раз работало то же самое
2. @keiji12, но смысл ясен. Какой компилятор вы используете
3. Я использую gcc, извините, так как я не так хорошо разбираюсь в подобных вещах, я просто установил его некоторое время назад вместе с некоторыми расширениями в студийном коде для одного семестра лабораторных работ и ничего не изменил после этого