HI我正在尝试理解指针和数组,当我在youtube上观看视频时,我发现了这个我试图自己创建的例子。以下是代码。
#include <stdio.h>
#include <math.h>
main()
{
int arr[][2]={{11,12},{21,22},{31,32},{41,42},{51,52}};
int i,j;
arr[5][1]=61;
arr[5][0]=62;
arr[6][1]=71;
arr[6][0]=72;
arr[7][1]=81;
arr[7][0]=82;
for(i=0;i<=7;i++)
{
for(j=0;j<=1;j++)
{
printf("%d %d %u %u %d %d %d \n",i,j,arr[i],arr[i]+j,arr[i][j],*(*(arr+i)+j),*(arr[i]+j));
}
}
}
当我执行代码时,它给了我
0 0 3216856768 3216856768 11 11 11 0 1 3216856768 3216856772 12 12 12 1 0 3216856776 3216856776 21 21 21 1 1 3216856776 3216856780 22 22 22 2 0 3216856784 3216856784 31 31 31 2 1 3216856784 3216856788 32 32 32 3 0 3216856792 3216856792 41 41 41 3 1 3216856792 3216856796 42 42 42 4 0 3216856800 3216856800 51 51 51 4 1 3216856800 3216856804 52 52 52 5 0 3216856808 3216856808 0 0 0 5 1 3216856808 3216856812 5 5 5 6 0 3216856816 3216856816 72 72 72 6 1 3216856816 3216856820 71 71 71 7 0 3216856824 3216856824 82 82 82 7 1 3216856824 3216856828 81 81 81
为什么arr [5] [0]和arr [5] [1]没有被分配给定值? 5和0来自哪里?
答案 0 :(得分:3)
C不是魔术(也不是脚本语言)。如果创建一个包含5个元素的数组,那么它将包含5个元素。无论你用它做什么,它都不会自动扩展。之后,如果您从其边界访问数组,则会导致未定义的行为。这段代码甚至可能崩溃。
你应该做的是要么声明一个足够大的数组:
int arr[8][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 }, { 51, 52 } };
然后您可以正确分配给他们;或使用标准内存管理函数malloc()
和realloc()
:
int **arr = malloc(sizeof(*arr) * 5);
int i;
for (i = 0; i < 5; i++) {
arr[i] = malloc(sizeof(**arr));
}
并逐一填写
arr[0][0] = 11;
arr[0][1] = 12;
// etc.
然后在需要时展开它:
arr = realloc(arr, sizeof(*arr) * 8);
for (i = 5; i < 8; i++) {
arr[i] = malloc(sizeof(**arr));
}
在此之后,您也可以安全地使用arr[5]...arr[7]
。但是,在后一种情况下,不要忘记free()
使用后需要释放的所有指针。