【问题标题】:Directly assigning values to C Pointers直接给 C 指针赋值
【发布时间】:2013-07-13 23:59:12
【问题描述】:

我刚刚开始学习 C,并且一直在使用 MinGW for Windows 运行一些简单的程序,以了解指针的工作原理。我尝试了以下方法:

#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;
}

效果很好。

我的问题是,为什么我不能直接为指针设置文字值?我查看了在线教程以获取指针,其中大多数都按照与第二个示例相同的方式进行操作。

感谢任何帮助。

【问题讨论】:

  • 因为该指针未初始化 - 它可能指向几乎任何地方并可能导致程序崩溃。
  • 你很幸运,它因错误而终止。
  • @JonnyRo 是对的。在实际代码中,这种错误往往会导致为期一周的调试会话试图找出为什么其他变量每隔一段时间就会随机更改(永远不会在您实际测试它时,总是在您正在做的时候)公开演示)或安全漏洞,其中有人通过操纵不同的值将“is_admin”标志设置为 true。
  • 这个问题的标题“Directly assignment values to C Pointers”有点误导。整个问题是您为指针赋值。

标签: c pointers


【解决方案1】:

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

您需要在内存中的某处创建一个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;
}

【讨论】:

    【解决方案2】:

    在第一个例子中,ptr 没有被初始化,所以它指向一个未指定的内存位置。当您将某些内容分配给这个未指定的位置时,您的程序就会崩溃。

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

    【讨论】:

      【解决方案3】:

      第一个带有 cmets 的程序

      #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;             
      }
      

      cmets 的第二个程序

      #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 调用的结果。

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

      【讨论】:

        【解决方案4】:

        您可以为指针设置一个值,但是一旦您使用“new”为它请求内存。你的代码应该是这样的

        int main(){
            int *ptr;
            ptr = new int;    //ask for memory
            *ptr = 20;
            printf("%d", *ptr);
            return 0;
        }
        

        【讨论】:

        • new 是 C++。 OP 在询问 C.
        猜你喜欢
        • 1970-01-01
        • 2017-08-20
        • 2013-05-16
        • 2011-10-10
        • 1970-01-01
        • 2011-10-27
        • 2013-05-15
        相关资源
        最近更新 更多