分段错误:同时对数组进行冒泡排序
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++)
遍历所有元素。这几乎是自我记录。
请注意,这仅适用于数组标识符,不适用于指针。
#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++)
遍历所有元素。这几乎是自我记录。
请注意,这仅适用于数组标识符,不适用于指针。