1

我正在尝试打印一个数组,但是我没有得到所需的输出,循环完成打印预定义数组后出现奇怪的数字。

代码是:

#include <stdio.h>    
int main(){    
    int intArray[11] = {1,2,8,12,-13,-15,20,99,32767,10,31};
    int i=0;        
    for(i=0;i<sizeof(intArray);i++){
        printf("%d\n",intArray[i]);
    }
}

输出:

1
2
8
12
-13
-15
20
99
32767
10
31
11
1629976468
2674040
2665720
1627423265
1
2665616
-2147417856
1629976534
1629976468
2674040
0
1627423172
1629976532
0
1629110043
0
0
0
0
0
0
0
0
0
0
0
1629976538
0
1629956432
2674276
0
1627407935
4

5 回答 5

14

for循环中的中断条件错误!这会导致索引越界问题i超过最大索引值,这是因为10 数组长度只是11. 循环中断条件应该是 < 数组长度( = 11),但不是< 数组大小。的值sizeof(intArray)等于11 * sizeof(int)(= 44 )。

要理解它,请阅读:运算符 sizeof

6.5.3.4 sizeof 运算符,1125:

当您将sizeof运算符应用于数组类型时,结果是数组中的总字节数。

根据这个 whensizeof应用于静态数组标识符的名称(不是通过malloc()/分配calloc()的),结果是整个数组的大小(以字节为单位),而不仅仅是地址。这等于每个元素的大小乘以数组的长度。
换句话说:sizeof(intArray)= 11 * sizeof(int) ( 因为intArray长度是 11 )。所以假设if sizeof(int)is 4-bytes thensizeof(intArray)等于44

下面的代码示例及其输出将帮助您进一步理解(阅读评论):

int main(){
    int intArray[11] = {1, 2, 8, 12, -13, -15, 20, 99, 32767, 10, 31};
    int i = 0;
 
    printf("sizeof(intArray):  %d\n", 
            sizeof(intArray)                       //1. Total size of array
    ); 
    printf("sizeof(intArray[0]):  %d\n", 
            sizeof(intArray[0])                    //2. Size of one element
    ); 
    printf("length:  %d\n", 
            sizeof(intArray) / sizeof(intArray[0]) //3. Divide Size
    );    
    return 0;
}

输出:

sizeof(intArray):  44    //1. Total size of array:  11 * 4 = 44
sizeof(intArray[0]):  4  //2. Size of one element:  4
length:  11              //3. Divide Size:          44 / 4 = 11 

可以检查工作代码@ideone,注意:我假设 int 的大小是4.

现在请注意,数组的sizeof(intArray)长度44大于数组的长度,因此条件错误,并且您在运行时的代码中有未定义的行为。要更正它,请替换:

for(i=0; i < sizeof(intArray); i++)
//           ^--replace-----^
//            wrong condition = 44

和:

for(i=0; i < sizeof(intArray) / sizeof(intArray[0]); i++)
          // ^------------------------------------^
          // condition Corrected = 11 


 

为了计算数组的长度,我简单地将数组的总大小除以一个元素的大小,代码是:

sizeof(intArray) / sizeof(intArray[0])   // 44 / 4 = 11
     ^                 ^
total size of       size of first element
array   
  
于 2013-08-02T06:00:52.267 回答
4

sizeof以字节为单位为您提供数组的大小,而不是元素。要获得元素的数量,请除以一个元素的大小:

for(i = 0; i < (sizeof intArray / sizeof intArray[0]); i++)
{
    printf("%d\n", intArray[i]);
}

值得注意的是,这仅适用于数组类型,当您使用malloc.

于 2013-08-02T06:00:20.217 回答
3

您需要更改sizeof(intArray)

sizeof(intArray)/sizeof(int)

这将给出数组元素的数量。

于 2013-08-02T06:01:36.870 回答
2

您已声明intArray为 11int的数组。每个都int在内存中占用一定数量的字节(通常为四个)。所以整体的大小intArray是 11 * 4 = 44 字节。

当你说时i < sizeof(intArray),你就是在说i < 44。但是您的数组只有 11 个元素,而不是 44 个!因此,您的循环将继续超出数组边界。它将继续读取四字节块并将它们解释为整数,并打印出垃圾值。

这就是为什么所有的答案都说你需要让你的循环条件是

i < sizeof(intArray) / sizeof (intArray[0])

您需要将整个数组的大小除以单个元素的大小,以获得数组中元素的数量。既然你已经知道元素的数量,你可以让它更简单,只说

i < 11

但是对于您可能不知道数组大小的更一般的情况,您需要使用其他建议的循环条件。

于 2013-08-02T06:24:42.443 回答
2

更新

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

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

sizeof(intArray)给出数组的总大小(以字节为单位)而不是数组中的元素数。

于 2013-08-02T06:01:12.193 回答