我想知道是否有人可以帮助我完成我正在制作的以下C计划。代码只是创建一个指针,然后为其指定一个整数数组的地址。从那里,指针被赋予一个值,然后递增。 输出显示数组名称,数组地址和数组值。输出按预期工作,但数组中的最后一项增加了5,而不是一个。
代码如下所示:
#include <stdio.h>
main()
{
int numar[4]; //integer array
int x; //value for loop
int *p; //pointer
p=numar; //'point' p to address of numar array (no & necessary as arrays are pointers)
for(x=0;x<5;x++) //loop 0-4
{
*p=x; //assign the value of the first item in array to x
p++; //increment pointer for next iteration
}
for(x=0;x<5;x++) //loop 0-4
{
//display output of array name, array location and array value
printf("array[%d] is at address %p with value %d\n", x,&numar[x],numar[x]);
}
return 0;
}
以上代码的输出如下所示:
array[0] is at address 0061FF18 with value 0
array[1] is at address 0061FF1C with value 1
array[2] is at address 0061FF20 with value 2
array[3] is at address 0061FF24 with value 3
array[4] is at address 0061FF28 with value 8
如您所见,数组[4]的期望值应为4,但它是8。
非常感谢任何帮助。
非常感谢,
答案 0 :(得分:2)
为了使你的代码编译,我不得不做一个改变:我添加了&#39; int&#39;在&main;&#39;之前,主要功能可以正确返回0。
问题是您创建了一个大小为4的整数数组,但是您希望它包含5个项目。
int numar[4];
表示您的数组是为4个元素定义的:
numar[0]
numar[1]
numar[2]
numar[3]
因此,
numar[4]
未定义。
要解决此问题,请将您的阵列放大一个:
int numar[5];
我得到的输出是:
array[0] is at address 0x7fff557f0730 with value 0
array[1] is at address 0x7fff557f0734 with value 1
array[2] is at address 0x7fff557f0738 with value 2
array[3] is at address 0x7fff557f073c with value 3
array[4] is at address 0x7fff557f0740 with value 4
答案 1 :(得分:2)
抱歉,没有办法让数组的索引从1开始,所以它们从0开始,所以如果你有4个元素的数组,那么最后一个元素是索引3不是4的元素。
在您的代码中,您正在阅读五个元素,其中您只有一个包含4个元素的数组。
for(x = 0; x < 5; x++) // iterating five times not 4: 0, 1, 2, 3, 4
//....
*写入数组非元素的最糟糕的事情是加密其他变量,例如:
int a = 0; // initialized to avoid compiler complaining later on
int numar[4] = {0, 1, 2, 3}; // ok
numar[4] = 77; // writing to the fifth element which doesn't belong to numar. as you can see variable a right before numar
cout << a << endl; // a: 77!! where did a get this value? because a is right before numar so element five which doesn't belong to numar was allocated to a
在这个例子中我们无意中加入了其他变量(a)abd最令人沮丧的是编译器没有抱怨(我们将a初始化为0) 结果是容易出错,在巨大的代码中看起来无法捕捉。
答案 2 :(得分:1)
您的阵列使用的索引存在问题。
您正在使用int numar[4]
创建一个4元素数组。这将创建具有有效索引0,1,2和3的数组。此处没有索引[4]
!
因此,当您稍后在for
循环中填充和访问数组时,您应该将它们设置为:
for(x = 0; x < 4; x++) {
x < **4**
,而不是5
。此循环将检查索引0,1,2和3.
你的循环访问元素[4]
,它不属于数组。