我刚刚开始学习C语言,我一直在使用MinGW for Windows运行一些简单的程序,以了解指针是如何工作的.我try 了以下方法:

#include <stdio.h>

int main(){
    int *ptr;
    *ptr = 20;
    printf("%d", *ptr);
    return 0;
}

它编译正确,但当我运行可执行文件时,它不起作用——值没有打印到命令行,相反,我会收到一条错误消息,上面写着.exe文件已停止工作.

但是,当我try 将值存储在int变量中并将*ptr分配给该变量的内存地址时,如下所示:

#include <stdio.h>

int main(){
    int *ptr;
    int q = 50;
    ptr = &q;
    printf("%d", *ptr);
    return 0;
}

它工作得很好.

我的问题是,为什么我不能直接设置指针的文字值?我在网上看过教程中的指针,其中大多数都是按照第二个示例的方式来做的.

如有任何帮助,我们将不胜感激.

推荐答案

问题是您没有初始化指针.您已经创建了一个指向"您想要的任何地方"的指针-它可能是某个其他变量的地址,也可能是代码中间的地址,或者是一些根本没有映射的内存.

你需要在内存中的某个地方创建一个int变量,让int *变量指向它.

你的第二个例子做到了这一点,但它做了其他与此无关的事情.以下是你需要做的最简单的事情:

int main(){
    int variable;
    int *ptr = &variable;
    *ptr = 20;
    printf("%d", *ptr);
    return 0;
}

在这里,int变量没有初始化-但这很好,因为您只需要将那里的任何值替换为20即可.关键是pointer被初始化为指向variable.事实上,如果您愿意,您可以只分配一些原始内存来指向:

int main(){
    void *memory = malloc(sizeof(int));
    int *ptr = (int *)memory;
    *ptr = 20;
    printf("%d", *ptr);
    free(memory);
    return 0;
}

C++相关问答推荐

编译SDL 2时缺少SDL_ttf

单指针和空参数列表之间的函数指针兼容性

C中的__attributor__((aligned(4),packed))与 struct 的用法

在一个小型玩具项目中实现终端历史记录功能

可以将C变量限制为特定的读/写速度吗?

使用C时,Windows CMD中的argc参数是否包含重定向命令?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

在为hashmap创建加载器时,我的存储桶指向它自己

解决S随机内存分配问题,实现跨进程高效数据共享

防止C++中递归函数使用堆栈内存

这个计算C中阶乘的函数正确吗?

为 struct 中的数组动态分配内存时出错

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

不同原型的危险C函数是可能的

是否定义了此函数的行为?

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

在C程序中使用Beaglebone Black UART的问题

生产者消费者计数器意外输出的C代码

浮点正零何时不全为零?

未使用sem_open正确初始化信号量