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

segmentation fault: while bubble sort of arrays

#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,谁能帮我找出问题所在

改变

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)

在循环的条件下。

sizeof 运算符 return 是对象的大小 字节 ,而不是其中元素的数量。

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


要获得数组中元素的数量,请将数组大小(以字节为单位)除以其中一个元素的大小:

sizeof(data) / sizeof(int)

(附带说明,这不是二进制搜索。)

在您的代码中 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

最好使用像

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

然后使用

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

遍历所有元素。这几乎是自我记录。

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