【问题标题】:Why do these pointers cause a crash?为什么这些指针会导致崩溃?
【发布时间】:2013-04-28 21:55:59
【问题描述】:

我对以下代码崩溃的原因有些困惑:

int main(){
    int *a;
    int *b;

    *a = -2;
    *b = 5;  //This line causes a crash on my system.

    return 0;
}

由于声明,不应该在运行前自动为两个指针和两个整数分配内存吗?

还是必须始终显式分配内存?

【问题讨论】:

  • "不应该自动分配内存" -- 你从哪里得到这样的想法?这肯定是假的。应该为可以指向任意长数组int指针分配多少内存?
  • @Code-Guru:我会强调之前而不是必须。 ;-)
  • @PieterGeerkens 好点(呃)
  • 在大多数系统上,第一行也会崩溃......而且它在你的系统上也很可能发生。
  • 不要在黑暗中拍摄。买一本关于 C 的书。

标签: c memory-management


【解决方案1】:

没有。您只声明了指针,而不是它们指向的内容。指针是在堆栈上分配的,由于您没有将它们初始化为任何东西,它们的值是垃圾。

int main() {
    int a = 7;
    int *p_a;    // p_a contains whatever garbage was on the stack at its
                 // location when main() is called. (Effectively points nowhere).

    p_a = &a;    // p_a points to (gets the address of) variable a, also on
                 // the stack.

    printf("Before: a = %d\n", a);   // prints 7

    *p_a = -2;      

    printf("After: a = %d\n", a);    // prints -2

    return 0;
}

我会编写上面的示例,并在调试器中逐步执行它。你会明白我所说的p_a 所指的意思。


由于声明,不应该在运行前自动为两个指针和两个整数分配内存吗?

我只看到你指定了两个指针。这两个整数在哪里?

还是必须始终显式分配内存?

指针必须指向某物。堆栈上的局部变量,或堆中的malloc'd 内存。

【讨论】:

  • 难道 int * a 没有声明一个指向整数的指针吗?
  • @Josh 考虑一下“她的狗”这个短语。这是对某人的狗的引用,但如果你没有告诉我她是谁,那么告诉我“给她的狗一根骨头”是行不通的。同样,“指向 int 的指针”不会告诉系统它是哪个 int。
【解决方案2】:

在这段代码中:

int* a;
*a = -2;

a 是一个未初始化的指针,对其解引用会产生未定义的行为,幸运的是,您能够将其视为应用程序崩溃。

您需要在取消引用之前初始化指针(使其指向有效内存)(即在使用*取消引用运算符之前):

int a;
int* pA = &a;
*pA = -2;

【讨论】:

    【解决方案3】:

    考虑

    int m;
    int n;
    m = n;
    

    这是无效的,因为您正在尝试使用 n 但您尚未为其分配值。现在:

    int *a;
    *a = -2;
    

    同样,这是无效的,因为您尝试使用 a 但您尚未为其分配值。 a 的值不是int,而是指向int 的指针。例如,

    int someint;
    a = &someint;
    *a = -2;
    

    将 -2 放入 someint。如果没有分配给a,放置-2 的位置是无法确定的。还有,

    a = malloc(sizeof(int));
    *a = -2;
    

    这里,a 被赋予了堆中某个位置的地址值; -2 进入那个堆位置。

    也许一个类比会有所帮助:

    考虑一下“她的狗”这个短语。这是对某人的狗的引用,但如果你没有告诉我她是谁,那么告诉我“给她的狗一根骨头”是行不通的。同样,“指向 int 的指针”不会告诉系统它是哪个 int。

    【讨论】:

      【解决方案4】:

      您的 *a 和 *b 指针未正确初始化。 试试这个:

      int my_a;
      int my_b;
      
      int *a;
      int *b;
      
      a = &my_a;  // init the pointer a to the direction of my_a int variable
      b = &my_b;
      
      *a = 3;  // set the my_a value via pointer
      *b = 2;
      

      【讨论】:

        【解决方案5】:

        您刚刚声明了指针,但还没有初始化它们。因此,您不能确定是 *b = 5 导致程序崩溃。也可以是*a = -2。要修复它,您还应该初始化指针。

        int aval = -2;
        int bval = 5;
        
        int *a = &aval; // declared and initialized pointers
        int *b = &bval; 
        
        // Now you can change the value using the pointer
        *a = 15;
        *b = 20;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多