Я пытаюсь вычислить результат функции пола для поплавков <= 9999.
#include <stdlib.h>
include <stdio.h>
#include "string.h"
int main(int argc, char* argv[]) {
int i, j, k;
int x[1000];
for(i = 0; i < 10000; ++i){
x[i] = i;
}
printf("Enter a float in 0..9999: ");
scanf("%d", k);
tester(x, k);
}
int tester(int* c, int k) {
printf("x[%d] = %d\n", k, c[k]);
}
Когда компилятор пришел в себя;
for(i = 0; i < 10000; ++i){
x[i] = i;
}
это дает ошибку сегментации;
x[i] = i;
здесь.
Я уже проверял подобные вопросы о назначении ошибки сегментации, но не смог найти решения. Кто-нибудь может помочь?
вы индексируете 10 000, но ваш массив равен 1000. Вы должны изменить свой printf Enter a float
на integer
, поскольку %d
в scanf интерпретирует ввод как десятичный.
"%d"
(целое число в десятичном формате) является неправильным спецификатором формата для float
— вместо этого вам нужно использовать "%f"
, иначе поведение будет неопределенным.
Несоответствие между 1000 и 10000 является причиной, по которой следует использовать константы для — а для перебора массивов предпочтительно выводить размер из самого массива: sizeof(array)/sizeof(*array)
.
Массив x
имеет длину 1000, но вы обрабатываете его в цикле так, как если бы он имел длину 10 000. Доступ к x[i]
для i
больше или равно 1000 является неопределенным поведением, поскольку индекс находится вне диапазона массива.
Таким образом, ошибка сегментации возникает из-за того, что ваша программа обращается к памяти, доступ к которой ей запрещен.
Переменная k инициализируется и при получении ввода "&" отсутствует в операторе scanf. Это могло произойти из-за ошибки сегментации, так как значение "k" передается в функцию tester(). Как правило, в языке C мы получаем ввод с помощью «&», если только это не строка, которую вы не обязательно упоминаете в операторе scanf !!.
Добро пожаловать в мир волшебных чисел в коде. интервал х[
1000
]; и for(i = 0; i <10000
; ++i) Время подсчета 0 цифр.