C Ошибка сегментации в подфункции: Как узнать, что исправить? Что такое ошибка сегментации? - PullRequest
1 голос
/ 05 ноября 2011

Я продолжаю получать ошибку сегментации, но я не уверен, что это значит или как сказать, что вызывает это (я очень плохо знаком с программированием и Си).В этой функции, вызываемой main.c, мне нужно определить индекс наименьшего числа в строке eacg двумерного массива.

Вот мой код:

#include "my.h"

void findfirstsmall (int x, int y, int** a)
{
    int i;
    int j;
    int small;  

    small = y - 1;


printf("x = %3d, y = %3d\n", x, y);                      //trying to debug


    printf("f.  The first index of the smallest number is: \n");
    for(i = 0; i < x; i++)
        {
           for(j = 0; j < y; i++)          <---------- needs to be j, for any future readers
               {
                  if(a[i][small] > a[i][j])
                        small = j;
printf("small = %3d\n", small);                          //trying to debug
               }
           printf("Row: %4d, Index: %4d\n", i, small);
           small = y - 1;
           printf("\n");
        }
    printf("\n");
    return;
}

Печатается правильно для первого ряда, но не для второго.Это мой массив:

56 7 25 89 4
-23 -56 2 99 -12

Это то, что я получаю при запуске программы:

x =   2, y =   5 
f.  The first index of the smallest number is:  
small =   4  small =   0 
Segmentation fault

Это на C. Заранее спасибо за помощь!

Ответы [ 4 ]

5 голосов
/ 05 ноября 2011

Исправить typo:

       for(j = 0; j < y; j++)
                         ^^
3 голосов
/ 05 ноября 2011
printf("f.  The first index of the smallest number is: \n");
for(i = 0; i < x; i++)
    {
       for(j = 0; j < y; i++) // my guess is that you increment "i" instead of "j"
           {
3 голосов
/ 05 ноября 2011

Ошибка сегментации означает, что вы обращаетесь к памяти, которой вы не владеете.

Как мгновенное предположение, не глядя на ваш код - это ошибка на одну ошибку.Помните, что массивы C основаны на нуле.

Я посмотрю ваш код более скоро.

0 голосов
/ 05 ноября 2011

Обратите внимание, что существует разница между двумерным массивом и массивом указателей (см. этот вопрос ). В зависимости от того, что вы делаете в main(), это может быть вашей проблемой. Например, следующее не будет работать с функцией как есть, так как она передает указатель на память, содержащую массив массивов:

int arr[2][5] = { {  56,   7,  25,  89,   4 },
                  { -23, -56,   2,  99, -12 } };
findfirstsmall (2, 5, arr);

Однако это будет нормально, поскольку он передает массив указателей в начало каждого подмассива arr:

int arr[2][5] = { {  56,   7,  25,  89,   4 },
                  { -23, -56,   2,  99, -12 } };
int *tmp[2];
tmp[0] = &arr[0][0];
tmp[1] = &arr[1][0];
findfirstsmall (2, 5, tmp);
...