-1

我在尝试学习如何使用指针的小型 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;
}
4

3 回答 3

3

您需要分配 k 的地址而不是它的值..

int *ptr = &k;

之后ptr++; *ptr还会打印垃圾值(尽管行为未定义)

于 2013-10-24T03:20:15.913 回答
2

你的问题在这里:

int *ptr = k;

您将值分配给kptr不是地址,因此您缺少地址运算符(&):

int *ptr = &k;
           ^

gcc默认情况下会给出以下警告:

警告:初始化使指针从整数而不进行强制转换[默认启用]

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

ptr在此处递增后执行间接:

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

在这种情况下,这是未定义的行为,因为它将指向最后一个元素之后的一个,因为根据 C99 部分6.5.6 加法运算符7段,在这种情况下,指向非数组的指针被视为 1 元素数组。

于 2013-10-24T03:21:14.810 回答
2

指针的理解很简单,指针就是一个值,用来存放一个内存地址,你必须始终保证这个内存地址是可用的!

所以这是第一个错误;

int *ptr = k;

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

int *ptr;
ptr = &K

星号 (*) 用于获取存储在您分配的内存地址中的值。所以要增加价值,你应该

(*ptr)++ 

代替

ptr++

这将增加地址而不是值本身,并且您真的不知道那里存储了什么。

于 2013-10-24T03:39:36.567 回答