为什么这段代码通常可以工作,但有时会产生 Segmentation Fault?

韦内米斯蒂尔

这是我的代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/**************************************************
a is a pointer to an array of strings
b is a string
This function appends b to *a
n is the number of strings currently "held" by *a
**************************************************/
int append(char ***a, char *b, unsigned long n) {
    if (a && *a && **a) {
        char** tmp = realloc(*a, (n + 1) * sizeof(**a));
        if (tmp) {
            tmp[n] = b;
            *a = tmp;
            return 0;
        }
    }
    return -1;
}

void test() {
    char *words[7] = { "food", "is", "good", "to", "eat,", "like", "pizza" };
    char** a = malloc(1 * sizeof(*a));

    for (int i = 0; i < 7; i++) {
        append(&a, words[i], i);
        int j = 0; 
        while (j <= i) 
            printf("%s ", a[j++]); 
        printf("\n");
    }
}

int main() {
    test();
    return 0;
}

代码总是编译得很好,没有警告。并且可执行文件在大约 95% 的时间内按预期运行。但是大约有 5% 的时间,我会遇到分段错误。我知道故障发生在,a[j++]但我不明白为什么。

模板类型定义

看看这一行:

if (a && *a && **a)

当您malloc为 最初指向的一个元素留出空间时a,您实际上从未初始化该内存。因此,**a未初始化,因此读取它被认为是未定义的行为。在实践中,我怀疑有时分配给您的内存在某些情况下是空指针,而在其他情况下则不是,这是造成片状的原因。

我实际上认为您甚至不需要检查*a**a只要指针a本身不是空指针,您就可以修改它指向的指针 ( *a)。此外,这里实际上并不需要知道所指向的数组的第一个元素是否*a为 null( **a)。所以你可以用

if (a)

我会更进一步,甚至不会为 分配初始数组a,因为您实际上永远不会读取存储在那里的值。

其他要做的事情:该函数append返回一个状态代码,通知操作是成功还是失败。每次调用时检查该值是一个好主意append,以防万一失败。您可能还想将外部if语句更改为 an,assert以便如果有人使用错误参数调用它,它会停止并报告违反前提条件的情况,而不是失败并返回错误代码。毕竟,如果问题是“你给了我不可能正确的论点”,那就意味着代码中的某处存在逻辑错误。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Segmentation Fault中“代码”的含义是什么

来自分类Dev

segmentation fault (core dump)

来自分类Dev

Segmentation Fault 11 Redux

来自分类Dev

Qt Segmentation Fault strtod

来自分类Dev

C:为什么会出现这个 Segmentation Fault?

来自分类Dev

Segmentation fault (core dumped) with Threads

来自分类Dev

Cassandra: cqlsh segmentation fault on mac

来自分类Dev

Segmentation Fault(Core Dump)-代码在VS中有效,但在Linux终端中无效

来自分类Dev

我在C ++中更改当前目录的代码不断给我带来Segmentation Fault:11错误

来自分类Dev

Aligator:带有“ Segmentation fault”的路径分析fortran程序崩溃

来自分类Dev

segmentation fault in during dynamic memory allocation with malloc

来自分类Dev

Segmentation fault (core dumped) if variable inside main?

来自分类Dev

Cucumber Test with Frank on Yosemite result in Segmentation Fault

来自分类Dev

Xcode-编译Swift Segmentation Fault 11

来自分类Dev

在packageRunBuild Segmentation Fault上Gradle构建失败

来自分类Dev

用Segmentation Fault填充结构的数组崩溃

来自分类Dev

python Segmentation Fault(核心已转储)

来自分类Dev

调试期望脚本时出现“ Segmentation Fault”

来自分类Dev

c++ 出现奇怪的Segmentation fault

来自分类Dev

给出 Segmentation fault 和 idk where

来自分类Dev

为什么最后一个 SPLIT 函数会导致 SEGMENTATION FAULT?如何解决这个问题

来自分类Dev

shout-python segmentation fault我该如何解决?

来自分类Dev

Segmentation fault on printf - NASM 64bit Linux

来自分类Dev

Recursive quick-sort causing segmentation fault (not overflow)

来自分类Dev

iOS Xcode compile error: unable to execute command: Segmentation fault: 11

来自分类Dev

QtSerialPort has unavailable data, segmentation fault under Windows 8 only

来自分类Dev

Android在设备上安装APK会显示[SEGMENTATION FAULT]

来自分类Dev

在结构中输入字符串:segmentation fault

来自分类Dev

NASM x86_64 scanf segmentation fault

Related 相关文章

  1. 1

    Segmentation Fault中“代码”的含义是什么

  2. 2

    segmentation fault (core dump)

  3. 3

    Segmentation Fault 11 Redux

  4. 4

    Qt Segmentation Fault strtod

  5. 5

    C:为什么会出现这个 Segmentation Fault?

  6. 6

    Segmentation fault (core dumped) with Threads

  7. 7

    Cassandra: cqlsh segmentation fault on mac

  8. 8

    Segmentation Fault(Core Dump)-代码在VS中有效,但在Linux终端中无效

  9. 9

    我在C ++中更改当前目录的代码不断给我带来Segmentation Fault:11错误

  10. 10

    Aligator:带有“ Segmentation fault”的路径分析fortran程序崩溃

  11. 11

    segmentation fault in during dynamic memory allocation with malloc

  12. 12

    Segmentation fault (core dumped) if variable inside main?

  13. 13

    Cucumber Test with Frank on Yosemite result in Segmentation Fault

  14. 14

    Xcode-编译Swift Segmentation Fault 11

  15. 15

    在packageRunBuild Segmentation Fault上Gradle构建失败

  16. 16

    用Segmentation Fault填充结构的数组崩溃

  17. 17

    python Segmentation Fault(核心已转储)

  18. 18

    调试期望脚本时出现“ Segmentation Fault”

  19. 19

    c++ 出现奇怪的Segmentation fault

  20. 20

    给出 Segmentation fault 和 idk where

  21. 21

    为什么最后一个 SPLIT 函数会导致 SEGMENTATION FAULT?如何解决这个问题

  22. 22

    shout-python segmentation fault我该如何解决?

  23. 23

    Segmentation fault on printf - NASM 64bit Linux

  24. 24

    Recursive quick-sort causing segmentation fault (not overflow)

  25. 25

    iOS Xcode compile error: unable to execute command: Segmentation fault: 11

  26. 26

    QtSerialPort has unavailable data, segmentation fault under Windows 8 only

  27. 27

    Android在设备上安装APK会显示[SEGMENTATION FAULT]

  28. 28

    在结构中输入字符串:segmentation fault

  29. 29

    NASM x86_64 scanf segmentation fault

热门标签

归档