【发布时间】:2015-12-18 17:34:48
【问题描述】:
这只是我今天在玩一些代码时学到的东西。我还是C新手,请多多关照。
下面的代码基本上是获取一个只有一个元素的数组并检查它的大小和值(分别为 4 和 0)。然后它在数组中创建新元素并为这些新元素分配值,然后再次检查数组的大小。
我发现数组的大小没有增加。如果我从开始创建包含 5 个元素的数组,则数组大小为 20。如果我从开始只创建 1 个元素并稍后添加其他 4 个元素,则数组大小保持为 4,但仍包含 5 个元素的值。
有人能解释一下为什么会这样吗?这是一种在节省空间的同时为数组赋值的安全方法吗?还是这有什么问题?
我错过了什么吗?
如果我在错误的 Stack Exchange 论坛上发布了此内容,请告诉我,以便我删除它并在其他地方提问,谢谢。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int n = 5;
char temps[257] = "1 -2 -8 4 5\n";
int arr[1] = {0};
int c;
printf("\n-- START of Test area --\n\n");
// sizeof arr = 4
printf("Initial sizeof(arr) = %d\n\n", sizeof(arr));
// Initial values of arr
printf("Value of arr[0] = %d\n", arr[0]); // 0
printf("Value of arr[1] (no value assigned) = %d\n", arr[1]); // random number
printf("Value of arr[2] (no value assigned) = %d\n\n", arr[2]); // Random number
// sizeof arr = 4
printf("sizeof(arr) = %d\n\n", sizeof(arr));
// -- Creates new array elements and assigns values using temps
sscanf(temps, "%d\n %d\n %d\n %d\n %d\n", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]);
printf("New array elements and values using temps\n\n");
printf("Value of arr[0] = %d\n", arr[0]); // 1
printf("Value of arr[1] = %d\n", arr[1]); // -2
printf("Value of arr[2] = %d\n", arr[2]); // -8
printf("Value of arr[3] = %d\n", arr[3]); // 4
printf("Value of arr[4] = %d\n", arr[4]); // 5
printf("Value of arr[5] = %d\n\n", arr[5]); // 0
// Sizeof array = 4
printf("sizeof(arr) = %d\n\n", sizeof(arr));
printf("\n-- END of Test area --\n\n");
return 0;
}
【问题讨论】:
-
当代码命中
int arr[1] = {0}; ....printf("Value of arr[1] (no value assigned) = %d\n", arr[1]);时,它访问了数组边界之外的内存 --> 未定义的行为。其余代码没有真实性。