分段错误:同时冒泡排序数组

时间:2015-02-07 09:01:30

标签: c segmentation-fault bubble-sort

#include <stdio.h>

int main(void)
{
    int i, j, tmp;
    int data[] = {1, 6, 7, 10, 9, 8};
    for ( i = 0; i < sizeof(data); i++)
        for ( j = 0; j < sizeof(data) - 1; j++)
            if (data[j] > data[j + 1])
            {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
    for (i = 0; i < sizeof(data); i++) {
        printf("%d ", data[i]);
    }
    return 0;
}

此代码在运行时打印segmentation fault,有人可以帮我找出错误吗

4 个答案:

答案 0 :(得分:2)

更改

sizeof(data)

在所有for循环的条件下

sizeof(data)/sizeof(data[0])

这样做是因为sizeof(int-array)是数组中的元素数乘以sizeof(int) (通常为4个字节)。 sizeof(data[0])sizeof(int)相同,因为data[0]int.所以,您也可以使用

sizeof(data)/sizeof(int)

在循环的条件下。

答案 1 :(得分:1)

sizeof运算符返回 bytes 中对象的大小,而不是其中元素的数量。

例如,在您的代码中,sizeof(data)将返回24,因为数组中有6个元素,每个元素占用4个字节(大小为int)。


要获取数组中元素的数量,请将数组的大小除以其中一个元素的大小:

sizeof(data) / sizeof(int)

(作为旁注,这不是二元搜索。)

答案 2 :(得分:1)

使用像

这样的宏计算数组中元素数量的最佳做法
#define ARRAY_ELEMENT_COUNT(array)  (sizeof(array)/sizeof(array[0]))

然后使用

for (i = 0; i < ARRAY_ELEMENT_COUNT(data); i++)

迭代所有元素。这几乎是自我记录的。

请注意,这仅适用于数组标识符,而不适用于指针。

答案 3 :(得分:0)

在您的代码sizeof(data)24(它基于sizeof整数)。但是数组的限制只能达到6

因此它导致数组出界和分段错误。所以改变那个for循环 就像这样,在两个循环中。

 for ( i = 0; i < sizeof(data)/sizeof(data[0]); i++)

否则

 for ( i = 0; i < 6; i++) // 6 is no of values placed in that array