代码之家  ›  专栏  ›  技术社区  ›  Xinus

此C代码是否会导致分段错误?

c
  •  3
  • Xinus  · 技术社区  · 15 年前
    int *i;
    *i=123;
    
    6 回复  |  直到 15 年前
        1
  •  29
  •   Daniel A. White    15 年前

    它可以,但它又可以做任何事情——它展示了C标准所说的。” undefined behaviour “。

        2
  •  30
  •   Daniel A. White    15 年前

    对。没有分配给该值的内存 123 .

    比如初始化变量 int 不保证 0 ,一个 int* 不能保证是一个安全的地址。

    它还可能导致数据损坏。

        3
  •  3
  •   DigitalRoss    15 年前

    是的

        4
  •  2
  •   Hans Passant    15 年前

    32位操作系统上的粗略概率:

    • 触发硬件异常的几率:99.9995%
    • 损坏程序状态的几率:0.0005%
    • 意外击中正确记忆位置的几率:20亿分之一

    估计只是为了证明数量级。仅与发布版本相关。如果它确实破坏了程序状态,那么它这样做的几率就会一直攀升到接近100%。一个好的编译器使硬件异常在调试构建中的概率为100%。找一个好的编译器。

        5
  •  2
  •   Bob Jarvis - Слава Україні    15 年前

    是的,您发布的代码可能会导致分段错误。您有一个未初始化的指针(不指向任何已知位置),然后使用它来存储某些内容。“某物”去哪儿了?好问题,没有一致的答案。

    您需要初始化该指针。例如:

    int target = 0;
    int *i = ⌖ 
    
    printf("target=%d\n", target);
    *i=123; 
    printf("target=%d\n", target);
    

    我希望这有帮助。

        6
  •  1
  •   Gaim    15 年前

    int *i; 这会为指针分配内存,但该变量未初始化,因此其值完全是随机的。然后取消引用,这样您就有了一个随机地址,并在内存中对该位置执行写操作,但1)您不知道该位置在哪里2)该位置可能不是您的。你可以通过初始化来修复它,比如 int * i = ( int* ) malloc( sizeof(int) )