我在C(动态内存分配)中的细分错误来自何处?

时间:2018-12-16 16:59:26

标签: c list malloc dynamic-memory-allocation

使用Segmentation fault进行编译时,我得到了gcc。我很确定我找到了调试问题,但是我不知道是什么原因引起的。

首先关于列表和内存分配:

typedef struct Block *List;
struct Block { long start;  List next; };

除了我有创建新的List元素的功能

List
createBlock(long start, List next) {
    List l = malloc(sizeof(struct Block));
    if(l == NULL){
        exit(1);
    }
    l->start = start;
    l->next = next;

    return l;
}

当我调用

之类的函数时
...
List new = NULL;
new = createBlock(someNumber,NULL);
...

我有一个Segmentation fault,我不知道为什么

我正在调试createBlock(...),一切正常,直到返回为止。 因此,将createBlock的返回值分配给new时会发生错误,但是为什么呢?

我知道例如在使用字符串时,使用malloc时应使用strcpy而不是=。但这只是指针正确吗?说List a = b;对不应该是一个问题? 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您正在为在函数的本地范围内定义的变量分配内存。检查Rob对this question的回答。

您可以将指针传递给要修改的struct,而不是返回指针,以便可以访问和修改元素。像这样:

<?php

function connect(){
    $connection = mysqli_connect('localhost', 'root', '', 'img');
    if (!$connection){
        die('Error: Failed to connect DB!!');
    }
    return $connection;
}

function get_suggestions( $q ){
    $connection = connect();
    $sql = "SELECT `id`, `q_image`, `q_title`, `q_links` FROM `users` WHERE (`q_title` LIKE '%$q%')";
    $result = mysqli_query($connection, $sql);
    if ( mysqli_num_rows($result) ){
        return mysqli_fetch_all($result, MYSQLI_ASSOC);
    }
    return false;
}

function debug($arg){
    echo '<pre>';
    print_r($arg);
    echo '</pre>';
    exit;
}

?>

并根据需要在上面的范围内移动createBlock(long start, List next, List l) { if(l == NULL){ return 1; } (*l).start = start; ((*l).next) = next; return 0; }

编辑

我用以下代码测试了该功能,看来还可以:

malloc