子功能中的C分段故障:我如何知道要修复的内容?什么是分段错误?

时间:2011-11-05 02:15:14

标签: c multidimensional-array segmentation-fault

我不断遇到分段错误,但我不确定这意味着什么或如何判断是什么导致它(我对编程和C非常新)。在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 个答案:

答案 0 :(得分:5)

修复typo

       for(j = 0; j < y; j++)
                         ^^

答案 1 :(得分:3)

分段错误意味着您正在访问您不拥有的内存。

在没有查看代码的情况下即时猜测 - 这是一个错误的错误。记住C数组是基于零的。

我会尽快查看您的代码。

答案 2 :(得分:3)

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 :(得分:0)

请注意,二维数组和指针数组之间存在差异(请参阅this question)。根据您在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);