C程序中的数组
这是我的C程序代码:C程序中的数组,c,arrays,C,Arrays,这是我的C程序代码: #include<stdio.h> unsigned int count = 1; int main(void) { int b = 10; int a[3]; a[0] = 1; a[1] = 2; a[2] = 3; printf("\n b = %d \n",b); a[3] = 12; printf("\n b = %d \n",b); return 0; } 任何人都可以解释它的原因以及错误背后的原
#include<stdio.h>
unsigned int count = 1;
int main(void)
{
int b = 10;
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
printf("\n b = %d \n",b);
a[3] = 12;
printf("\n b = %d \n",b);
return 0;
}
任何人都可以解释它的原因以及错误背后的原因。您的写入超出了数组的界限。这将调用。您正在写入超出数组边界的内容。这将调用。您正在以[3]=12的速度编写;对于一个越界索引,它是UB,因为它的UB意味着任何事情都可能发生,所以很可能你刚刚在a[3]写了值,这是b的位置。你在a[3]=12写了值;对于一个越界索引,它是UB,因为它的UB意味着任何事情都可能发生,所以很有可能你刚刚在a[3]上写了值,a[3]是b的位置。所谓的未定义行为可以包括多种行为。其中包括: 没有坏事发生 您会遇到分段错误或任何其他访问冲突 您破坏/篡改了其他数据结构。
这里有后者:变量b恰好在数组后面的内存中,因此由于这种错误访问,它被修改。所谓的未定义行为可以包括多种行为。其中包括: 没有坏事发生 您会遇到分段错误或任何其他访问冲突 您破坏/篡改了其他数据结构。 这里有后者:变量b恰好在数组后面的内存中,因此由于这种错误的访问,它被修改了。您的程序有。根据您的结果,您的记忆如下所示:
a[0] a[1] a[2] b
+------+------+------+----+
| 1 | 2 | 3 | 12 |
+------+------+------+----+
b与a[3]相同,因为它在内存中位于它的旁边
这只是一种可能的情况,您的程序可能有分段错误或其他任何错误。您的程序有。根据您的结果,您的记忆如下所示:
a[0] a[1] a[2] b
+------+------+------+----+
| 1 | 2 | 3 | 12 |
+------+------+------+----+
b与a[3]相同,因为它在内存中位于它的旁边
这只是一种可能的情况,您的程序可能存在分段错误或其他任何问题。这是因为您正在访问[3],这是第4个元素,但您只定义了大小为3的数组。因此,您将得到一个指向垃圾数据的指针,它恰好指向b的内存位置。因此,当您分配a[3]时,您分配的是b的内存位置:
现在尝试实际创建一个包含四个元素的数组。将[3]更改为[4],以便[3]不是垃圾位置。您将看到它是有效的。这是因为您正在访问[3],这是第4个元素,但您只定义了一个大小为3的数组。因此,您将得到一个指向垃圾数据的指针,它恰好指向b的内存位置。因此,当您分配a[3]时,您分配的是b的内存位置:
现在尝试实际创建一个包含四个元素的数组。将[3]更改为[4],以便[3]不是垃圾位置。您将看到它的工作原理。也许您可以定义一个指向[3]地址的指针,并将其输出。然后你就知道答案了。也许你可以定义一个指向[3]地址的指针,然后输出它。然后您就知道答案了。因为如果您同时打印变量b和a[3]的地址
printf("%u",&b);
printf("\n %u",&a[3]);
然后它为两个变量地址提供相同的输出,因为如果同时打印变量b和a[3]的地址
printf("%u",&b);
printf("\n %u",&a[3]);
然后它为两个变量地址提供相同的输出您的程序会导致未定义的行为,这里的答案解释了这种未定义的行为,试图给您的输出赋予一些意义,这并不总是正确的。事实上,我试着运行你的程序,我可以看到b在printf和printf中都是10,最后我得到了运行时错误,我使用了Visual Studio 2010,你的程序导致了未定义的行为,这里的答案解释了这个未定义的行为,试图给你的输出赋予一些意义,这并不总是正确的。事实上,我试着运行你的程序,我可以看到在printf和printf中b都是10,最后我得到了运行时错误,我使用了Visual Studio 2010a[3]-有效索引是0,1,2。您的程序有未定义的行为。请参见-。当你不在你的极限时,任何事情都可能发生。未定义的行为!a[3]-有效索引为0,1,2。您的程序有未定义的行为。请参见-。当你不在你的极限时,任何事情都可能发生。未定义的行为!每个人怎么能这么快回答这些问题?我打字,然后4个人在我之前15秒发帖子,然后竖起3个大拇指…:-/@gyeh我很快。。。呵呵,没有乔恩·斯基特那么快:为什么每个人都这么快回答这些问题?我打字,然后4个人在我之前15秒发帖子,然后竖起3个大拇指…:-/@gyeh我很快。。。呵呵,没有Jon Skeet那么快:Phi@devnull我同意你的答案我很想看看Maroun先生的答案他解释了变量的内存分配是否正确。请让我know@user3270582如前所述,结果未定义。给定本例中的特定输出,可以假设a[3]重写了b。但这并不一定会发生。您的代码也可能导致分段错误,或者可能产生10或0的结果。N
hi@devnull我同意你的答案。如果Maroun先生回答什么,我会很痛苦。Maroun先生解释变量的内存分配是否正确。请让我know@user3270582如前所述,结果未定义。给定本例中的特定输出,可以假设a[3]重写了b。但这并不一定会发生。您的代码也可能导致分段错误,或者可能产生10或0的结果。什么都不能保证。
printf("%u",&b);
printf("\n %u",&a[3]);