Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序中的数组_C_Arrays - Fatal编程技术网

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; } 任何人都可以解释它的原因以及错误背后的原

这是我的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;
}

任何人都可以解释它的原因以及错误背后的原因。

您的写入超出了数组的界限。这将调用。

您正在写入超出数组边界的内容。这将调用。

您正在以[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 2010

a[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]);