我在一个小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;
}
答案 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++
这会增加地址而不是值本身,你真的不知道那里存储的是什么。