从C中的函数调用返回时的分段错误

时间:2014-04-08 01:38:29

标签: c segmentation-fault

该程序使用C语言编写,并由PuTTy会话中的服务器使用GCC编译。该程序也由同一台服务器运行。

我发送带有2个参数的函数调用。 " a",一个二维整数数组,包含11列和不同数量的行和" clients",一个整数,指定数组中存在多少行。 (服务器询问用户将服务多少客户端并创建" a"作为具有多行的数组。理想情况下,这些函数调用适用于任意数量的客户端。)

在此函数调用中,将检查每个客户端保存当前状态的列。如果任何客户端处于状态(由整数表示)0,1,2,3或4,则该函数返回1.否则,该函数返回0.此函数如下所示。

int incomplete(int a[][11], int clients) {
    for (i = 0; i < clients; i++) {
        if (a[i][1] == 0 || a[i][1] == 1 || a[i][1] == 2 || a[i][1] == 3 || a[i][1] == 4) {
            return 1;
        }
    }
    return 0;
}

进行调用的函数是while循环继续循环的条件。如果发现任何客户端处于状态0,1,2,3或4,则while循环应继续执行。

while (incomplete(a, clients) == 1) {
    ...
}

然而,在返回一个值时,程序会立即崩溃,并出现&#34; Segmentation Fault(core dumped)&#34;错误。现在我已经完成了研究,并且由于内存泄漏,访问超出范围的内存位置,堆栈问题等而经常发生分段错误。

问题是,当函数调用如此简单和干燥时,我不知道我是如何得到分段错误的。发送一个包含33个整数的数组(没有什么大的,只有3个客户端的11列信息),一个表示行数的整数,然后返回一个整数进行比较。

有趣的是,具有相似参数的类似功能完全正常。它没有回报价值。

void printArray(int a[][11], int clients) {
    printf("\n\n+-------+----+----+----+----+----+----+----+----+----+----+");
    for (i = 0; i < clients; i++) {
        printf("\n| %5d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d |",
            a[i][0], a[i][1], a[i][2], a[i][3],
            a[i][4], a[i][5], a[i][6], a[i][7],
            a[i][8], a[i][9], a[i][10]);
    }
    printf("\n+-------+----+----+----+----+----+----+----+----+----+----+\n\n");
}

该方法称为...

printArray(a, clients);

我可以通过在incomplete()函数中返回任何整数值来重现该问题。我还可以说通过放置伪printf语句来跟踪代码的执行,然后在它尝试返回值时可预测地崩溃,从而完成了对incomplete()函数的处理。

这里发生了什么?我的代码的pastebin可以在这里找到: serverTest5.c --- http://pastebin.com/dHfVmKki listQueue3.h --- http://pastebin.com/gvpHFsdF

阵列&#39; a&#39;使用以下代码定义和填充...

// Create Multidimensional Array for Processes
int a[clients][11];

// Create CommonFIFO
printf("\nSERVER: Making CommonFIFO...");
if ((mkfifo("CommonFIFO",0666)<0 && errno != EEXIST)) {
    perror("\nERROR:  Can't create CommonFIFO.");
    exit(-1);
}

// Open CommonFIFO, reading
printf("\nSERVER: Opening CommonFIFO to read...");
if ((fda=open("CommonFIFO", O_RDONLY))<0)
    printf("\nERROR:  Can't open CommonFIFO to read."); 
// For each Client
for (i = 0; i < clients; i++) {
    // Read clientID, arrival time, and 5 bursts from CommonFIFO
    printf("\nSERVER: Servicing Client %d.\nSERVER: Reading CommonFIFO...", i+1);
    finish = read(fda, &input, sizeof input);
    printf("\nSERVER: Received job.");

    // Enter the data into the array
    a[i][0]  = input.clientID;
    a[i][1]  = 0;
    a[i][2]  = input.timeArrival;
    a[i][3]  = input.burst1;
    a[i][4]  = input.burst2;
    a[i][5]  = input.burst3;
    a[i][6]  = input.burst4;
    a[i][7]  = input.burst5;
    a[i][8]  = 0;
    a[i][9]  = 0;
    a[i][10] = 0;   
}       

0 个答案:

没有答案