Как обрабатывать выделение памяти в C - PullRequest
1 голос
/ 16 апреля 2019

Я новичок в C, и я создаю простую программу, в которой я записываю значение в многомерную ошибку. Но я получаю ошибку "Segmentation fault" или какое-то время, когда я запускаю код, который получается в цикле Infinite.

int main(){
int i,j;
int num1=10; 
int num2=10; 
double data[num1][num2];


    for(i=0;i<=num1;i++){
        for(j=0;j<=num2;j++){
            if(i==0) {
                data[i][j]=121.21;
            }
            else {
                data[i][j]=0.0;
            }
        }
    }
}

Когда я делаю жесткое кодирование значений в структуре ниже, все работает нормально: измените double data[num1][num2]; на double data[10][10];

Как мы можем исправить эту проблему в C.

Ответы [ 2 ]

5 голосов
/ 16 апреля 2019

Вы превышаете границы массива в ваших циклах:

for(i=0;i<=num1;i++){
    for(j=0;j<=num2;j++){

Во внешнем цикле i колеблется от 0 до num1, а во внутреннем цикле j колеблется от 0 до num2. Однако максимальный допустимый индекс для каждого измерения массива составляет num1-1 и num2-1 соответственно. Чтение / запись после конца массива вызывает неопределенное поведение , поэтому иногда оно работает, а иногда нет.

Измените условия цикла на <:

for(i=0;i<num1;i++){
    for(j=0;j<num2;j++){
0 голосов
/ 16 апреля 2019

Кажется, вы перебираете память, доступ к которой предоставляет программа. Вы выделяете память для 100 значений (10 * 10). Однако при работе с массивами в большинстве языков программирования важно, чтобы вы знали, что индекс 0 считается одним из таких, что вы можете перейти из массива [0] - массива [9], и это объявляет массив с памятью на 10 мест, поскольку мы начинаться с 0 в большинстве языков программирования.

Чистый способ исправить этот код будет:

for (int i=0; i < num1; i++) {
    for (int j=0; j < num2; j++ {

Это позволит избежать доступа к ячейке памяти с индексом 10, который не выделен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...