“分段错误”可能是由C中的内存分配发出的

时间:2018-06-02 17:26:49

标签: c pointers segmentation-fault gdb

在这段代码中,我想找到句子中最长的单词 在哪里我停止了一个分段错误,我认为是由于函数longerEvenWord()中的内存分配将返回“res”变量;似乎res没有正确分配。通过运行gdb我得到以下错误

Scenario Outline:
    * def query = { name: <name>, country: <country>, active: <active>, limit: <limit> }

    Given path 'search'
    And params query
    When method get
    Then status 200
    # response should NOT contain a key expected to be missing
    And match response !contains <missing>

    # observe how strings are enclosed in quotes, and we set null-s here below
    # and you can get creative by stuffing json into table cells !
    Examples:
    | name   | country   | active | limit | missing                                                      |
    | 'foo'  | 'IN'      | true   |     1 | {}                                                           |
    | 'bar'  | null      | null   |     5 | { country: '#notnull', active: '#notnull' }                  |
    | 'baz'  | 'JP'      | null   |  null | { active: '#notnull', limit: '#notnull' }                    |
    | null   | 'US'      | null   |     3 | { name: '#notnull', active: '#notnull' }                     |
    | null   | null      | false  |  null | { name: '#notnull', country: '#notnull', limit: '#notnull' } |

这是代码

Program received signal SIGSEGV, Segmentation fault.
_IO_vfprintf_internal (s=0x0, format=0x400d22 "%s\n", 
ap=ap@entry=0x7fffffffdca8) at vfprintf.c:1275
1275    vfprintf.c: No such file or directory.

2 个答案:

答案 0 :(得分:1)

这条线是否有可能是您的问题?       FILE * fptr = fopen(getenv(“OUTPUT_PATH”),“w”);

fopen可能会失败,并返回NULL,原因与内存损坏无关。也许添加一行,就像上面的那样:

if (fptr == NULL) { perror(“fopen failed”); exit(1); }

答案 1 :(得分:0)

Wikipedia上有一篇文章Dangling Pointer,它可以很好地解释您的代码问题。

简而言之,从函数返回后,所有自动变量都会丢失内存控制。因此,不能假设您存储某些数据的地址将保持不变;例如,另一个功能可能已经覆盖了这个地方。

您可以使用res使malloc动态化,并使用strcpy初始化,如下所示。

char *res = (char *)malloc(134 * sizeof(char));
strcpy(res, "00");

确保在使用后释放动态变量,否则它们会导致内存泄漏,但在程序中它不会成为问题,因为它只是在打印res后结束。