【问题标题】:Can't assign values to variable and pointer [duplicate]无法为变量和指针赋值[重复]
【发布时间】:2012-07-02 16:27:23
【问题描述】:

我对 C 很陌生,但不知道为什么这个程序会中断。如果我删除与i 有关的行,程序将编译并运行,但如果我分配i,我将无法再为*ptr 分配任何东西而不会中断程序。

int main(void)
{
    int i;
    int *ptr;

    i = 2;
    *ptr = 5;
    printf("%d",*ptr);
}

【问题讨论】:

  • This 几乎相同问题是昨天才提出的。
  • 问题是你创建了一个指针,但没有给它任何指向的东西。您可以使用 new 为其分配一些内存,或者将其指向 i 之类的变量。

标签: c pointers


【解决方案1】:

您将指针保留为未初始化的值。因此,当您取消引用它 (*ptr) 时,您会访问内存中的任意位置,从而导致分段错误。

通过将变量地址(如&i)或一些新分配的内存(如malloc(sizeof(int)))分配给ptr本身(而不是*ptr),将ptr指向某物。

【讨论】:

  • 那么,如果我只使用int *ptr;*ptr = 5;,为什么它会起作用?
  • 它可能会“工作”或崩溃,具体取决于您的平台、编译器、设置...无论哪种方式,它都是不正确的。 C 是一种不安全的语言,它不检查内存错误,它们可能会在你的程序中被忽视并在意想不到的时候触发。 :)
  • 谢谢!我以前从未使用过手动内存管理语言,所以这对我来说是全新的。当然还有更多需要考虑。
【解决方案2】:

这是 C 的答案:

int main(void) {
    int i;
    int * ptr = (int *)malloc(sizeof(int));

    i = 2;
    *ptr = 5;     
    printfn("%d",*ptr); 
    free(ptr);
}

或者,您可以为 i 和 *ptr 分配行使用类似的东西:

int main(void) {
    int i;
    int * ptr;

    i = 2;
    ptr = &i;     
    printfn("%d",*ptr); // should print 2
}

还要注意免费出来了!!!

【讨论】:

    【解决方案3】:

    你声明了 ptr 但没有让它指向任何东西。然后,您尝试写入它指向的内容。这从来都不是一个好主意。尝试通过添加行使 ptr 指向 i

    ptr = &i;
    

    在您尝试写入 *ptr 之前

    【讨论】:

      【解决方案4】:

      在 C 中使用指针之前,您需要将指针设置为现有内存块,您需要为其分配内存,如下所示。

      int *ptr = (int *)malloc(sizeof(int));
      

      【讨论】:

        猜你喜欢
        • 2019-02-09
        • 2020-07-27
        • 2021-04-06
        • 2019-11-05
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-13
        相关资源
        最近更新 更多