#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
,有人可以帮我找出错误吗
答案 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