【问题标题】:Segmentation Fault when attempting to print value in C尝试在 C 中打印值时出现分段错误
【发布时间】:2012-07-01 22:44:01
【问题描述】:

以下 C 代码返回“分段错误”错误。我不明白为什么它不返回值 20。我的错误是什么?

#include <stdio.h>

int main() 
{
    int* n;
    *n = 20;

    printf("%i\n",*n);

    return 0;

}

【问题讨论】:

  • 'n' 是一个未初始化的指针值,您在 '*n = 20' 行中取消引用。如果您希望使用指针,则需要确保在尝试取消引用之前将其初始化为指向有效的内存位置。
  • 除了已经给出的答案之外,您可以只使用int n=20 并将&amp;n(n 的地址)传递给任何需要int* 作为参数的函数。

标签: c pointers segmentation-fault


【解决方案1】:

你还没有为n分配内存,所以

*n = 20;

尝试写入未指定的内存。

试试

#include <stdlib.h>

int *n = malloc(sizeof *n);
/* use n */
free(n);

【讨论】:

    【解决方案2】:

    你还没有为你的int分配空间,你只是声明了一个指向int指针

    指针未初始化,因此写入内存中的未知空间是未定义的行为并会导致问题。这通常会导致段错误。

    您可以使用malloc 为整数分配一个槽:

    n = malloc(sizeof(int));
    

    并且稍后使用对free的相应调用来释放内存:

    free(n);
    

    但是为整数分配单个槽是非常不寻常的,通常你会在堆栈上分配int

    int n;
    n = 20;
    

    【讨论】:

      【解决方案3】:

      您正在尝试将20 写入垃圾值。您必须通过使用 *alloc() 函数之一或在堆栈上创建一个 int 并获取它的地址来为其分配空间(正如 Richard J. Ross III 在 cmets 上提到的那样)。

      动态分配:

      int n*; 
      n = malloc(sizeof(int));  /* allocate space for an int */
      if(n != NULL) {
       /* do something.. */ 
       free(n); /* free 'n' */
      } else {
        /*No space available. */
      }
      

      或在堆栈上:

      int int_on_stack;
      int *n = &int_on_stack;
      *n = 20;
      printf("%i\n", *n); // 20
      

      【讨论】:

      • 请注意,malloc 不是唯一的解决方案。有mmapalloca,简单的在栈上创建一个int,得到它的地址。
      • @RichardJ.RossIII:谢谢。已更新。
      • 您的堆栈示例与“得到它的答案”不一致。你想要的是int onstack; int n = &amp;onstack; *n = 20; printf("%i\n",*n); ...嘿,我有编辑权限,所以我继续进行更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多