具有指针递增错误值的C程序

时间:2016-10-24 00:15:38

标签: c arrays pointers

我想知道是否有人可以帮助我完成我正在制作的以下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。

非常感谢任何帮助。

非常感谢,

3 个答案:

答案 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],它不属于数组。