3

谁能解释以下程序的输出?a[i] = 0;如果使用,我会得到一个无限循环,使用时会出现段错误,以及使用时之间a[i] = i;i范围,而在给出段错误之前使用时它会变为 39 。0 - 9a[i] = 0;a[i] = i;

#include<stdio.h>
#include<stdlib.h>
int mult(int a, int b);
int main()
{
    int a[10];
    int i = 0;
    for(i=0; i < sizeof(a); i++)
    {
        a[i] = i;
        printf("a[i]=%d i=%d\n", a[i], i);
    }
    return 0;
}
4

4 回答 4

7

当您将sizeof运算符应用于数组类型时,结果是数组中的总字节数,即在这种情况下sizeof(a)确定的字节a数不是数组中的元素数。用于sizeof(a)/sizeof(a[0])获取数组中的元素数a
代替

for(i=0;i<sizeof(a);i++)

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

此外,无需初始化i两次。

于 2013-09-16T17:44:22.393 回答
5

您可能想要更改此行:

for(i=0;i<sizeof(a);i++)

对此:

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

笔记:

  • sizeof(a)给出 中的字节a[]

  • sizeof(a)/sizeof(a[0])给出 中的元素a[]

于 2013-09-16T17:44:45.407 回答
3

sizeof不做你认为它做的事。它返回整个数组占用的字节数。

您需要数组的数字长度,而不是字节大小。

尝试这样的事情:

const int array_size = 10;
int a[array_size];

for (int i = 0; i < array_size; i++) {
    a[i] = i;
    printf("a[%d] = %d\n", i, a[i])
}
于 2013-09-16T17:44:06.643 回答
2

如果您想知道循环多远而不将其存储在单独的常量中,请使用sizeof(a)/sizeof(a[0])

于 2013-09-16T17:46:31.890 回答