2013-07-15 53 views
8

我刚刚开始学习C,我一直在使用MinGW for Windows运行一些简单的程序来理解指针如何工作。我试过如下:直接将值分配给C指针

#include <stdio.h> 

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

其正确的编译,但是当我运行可执行它不工作 - 该值不会被打印到命令行,而不是我得到的.exe文件发出错误讯息已停止工作。

然而,当我试图在一个int变量并分配* ptr转到该变量的存储器地址存储的值,如下所示:

#include <stdio.h> 

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

它工作正常。

我的问题是,为什么我无法直接设置文字值的指针?我已经在线查看了教程,其中大部分都和第二个例子一样。

任何帮助表示赞赏。

+0

指针未初始化的原因 - 它可能指向几乎任何地方并可能导致程序崩溃。 – Till

+1

你很幸运,它终止了一个错误。 – JonnyRo

+1

@JonnyRo是对的。在真实的代码中,这种错误往往会导致为期一周的调试会话,试图找出为什么其他变量每隔一段时间就会随机更改一次(从不在实际测试它时,总是在做时公开演示)或安全漏洞,通过操纵不同的值来将“is_admin”标志设置为true。 – abarnert

回答

20

问题是你没有初始化指针。你已经创建了一个指向“你想要的任何地方”的指针,这个指针可以是其他变量的地址,也可以是你的代码的中间,或者是一些根本没有映射的内存。

您需要在内存中的某个位置创建一个int变量,指向int *变量。

你的第二个例子是这样做的,但它做了其他与这里无关的事情。下面是你需要做的最简单的事情:

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

这里,int变量没有被初始化,但是没有关系,因为你只是打算更换任何价值在那里与20。关键是指针被初始化为指向variable。事实上,你可以只分配一些原始内存为指向,如果你想:

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

在第一个例子,PTR尚未初始化,使其指向一个未指定的存储位置。当你为这个未指定的位置分配一些东西时,你的程序就会爆炸。

在第二个示例中,当您说ptr = & q时设置地址,所以你没问题。

7

的第一个程序与评论

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create a pointer that points to random memory address 

    *ptr = 20;   //Dereference that pointer, 
          // and assign a value to random memory address. 
          //Depending on external (not inside your program) state 
          // this will either crash or SILENTLY CORRUPT another 
          // data structure in your program. 

    printf("%d", *ptr); //Print contents of same random memory address 
          // May or may not crash, depending on who owns this address 

    return 0;    
} 

第二个程序与评论

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create pointer to random memory address 

    int q = 50;   //Create local variable with contents int 50 

    ptr = &q;    //Update address targeted by above created pointer to point 
          // to local variable your program properly created 

    printf("%d", *ptr); //Happily print the contents of said local variable (q) 
    return 0; 
} 

最关键的是,直到你知道它是分配给您自己已管理的地址,则无法使用指针,无论是通过将它指向您创建的另一个变量或malloc调用的结果。

之前使用它创建的代码依赖于未初始化的内存,它最多会崩溃,但在最糟糕的情况下有时会工作,因为随机内存地址恰好在您的程序已拥有的内存空间内。如果它覆盖你在程序中其他地方使用的数据结构,上帝会帮助你。

+1

好的例证。 – abarnert