C中的指针增量

时间:2013-10-24 03:18:29

标签: c arrays pointers increment

我在一个小C程序中遇到一个奇怪的错误,我正在尝试学习如何使用指针。

我认为一切正常,因为它已经编译但是当我尝试运行代码时,它说C程序已停止响应。我一定做错了什么......有什么帮助吗?

#include <stdio.h>


int main()
{

int k = 22;
int z = 11;
int *ptr = k;

 printf("%d \n",*ptr);
 ptr++;
 printf("%d \n",*ptr);




    getchar();
    return 0;
}

3 个答案:

答案 0 :(得分:3)

您需要指定k的地址而不是它的值..

int *ptr = &k;

同样在ptr++; *ptr之后会打印垃圾值(虽然行为未定义)

答案 1 :(得分:2)

你的问题在这里:

int *ptr = k;

您要将k的值分配给ptr而不是地址,因此您缺少地址运算符(&):

int *ptr = &k;
           ^
默认情况下,

gcc会发出以下警告:

  

警告:初始化使得整数指针没有强制转换[默认情况下启用]

因此,如果您没有看到警告,那么您应该启用警告。

在此处增加后在ptr上执行间接:

ptr++;
printf("%d \n",*ptr);
               ^
               indirection

在这种情况下它是未定义的行为,因为它将指向一个超过最后一个元素,因为根据C99部分6.5.6 Additive,指向非数组的指针被视为1个元素数组运营商 7

答案 2 :(得分:2)

理解指针非常简单,指针是存储内存地址的值,您必须始终确保内存地址可用!

所以这是第一个错误;

int *ptr = k;

所以,在你使用它之前,你应该为ptr分配一个有效的存储器地址,正确的是

int *ptr;
ptr = &K

star(*)用于获取存储在您指定的内存地址中的值。所以为了增加价值,你应该

(*ptr)++ 

而不是

ptr++

这会增加地址而不是值本身,你真的不知道那里存储的是什么。