将内存分配给不同的结构会更改完全不同的结构的指针成员

虚拟机

函数分配matrix具有[row, column]一对值的结构的内存会create_matrix更改layer->valuesmatrix分配的结构无关指针的

一些测试[row, column]值是:

[1, 2]
[2, 2]

gdb [2,2]的输出,即create_matrix(2, 2)

(gdb) print *prev_layer
$1 = {
  nodes = 2,
  weights = 0xb6438030,
  biases = 0xb6438060,
  values = 0xb6438080
}
(gdb) n
(before allocation): 0xb6438080
50          weights = create_matrix(2, 2);
(gdb) n
51          if (!weights)
(gdb) print *prev_layer
$2 = {
  nodes = 2,
  weights = 0xb6438030,
  biases = 0xb64380b0, <- this changes
  values = 0xb64380c0 <- this changes
}
(gdb)

从上面看来,它会将与内存分配关联的最后两个指针分配给该结构的最后两个成员。有时甚至是NULL指针

程序输出[2,2]

Values of prev_layer->values
(before allocation): 0xb6438080
(after allocation): 0xb64380c0

使用的代码:

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


typedef struct matrix {
    int rows;
    int cols;
    double **m;
} matrix;

typedef struct layer {
    int nodes;
    matrix *weights;
    matrix *biases;
    matrix *values;
} layer;

matrix *create_matrix(int rows, int cols) {
    matrix *ret = malloc(sizeof(matrix));
    if (!ret)
        return NULL;
    double **m = malloc(rows * sizeof(double *));
    if (!m)
        return NULL;

    for (int c = 0; c < rows; c++) {
        m[c] = calloc(cols, sizeof(double));
        if (!m[c]) {
            return NULL;
        }
    }

    ret->rows = rows;
    ret->cols = cols;
    ret->m = m;

    return ret;
}

layer *create_layer(int nodes, const layer *prev_layer) {

    matrix *weights, *biases;
    /* Just after allocation it changes pointer of
     * prev_layer->bias and prev_layer->values
     * to last to matrix row allocations
     * bug works with values in ordered pair [row, col] => [1,2], [2,2],
     * doesn't with when used values like [5,3]
     * */
    if (prev_layer)
        printf("(before allocation): %p\n", prev_layer->values);

    weights = create_matrix(1,2);
    if (!weights)
        return NULL;

    if (prev_layer)
        printf("(after allocation): %p\n", prev_layer->values);

    biases = create_matrix(1, nodes);
    if (!biases)
        return NULL;

    matrix *values = create_matrix(1, nodes);
    if (!values)
        return NULL;

    layer *ret = malloc(sizeof(layer *));
    if (!ret)
        return NULL;

    ret->nodes = nodes;
    ret->weights = weights;
    ret->biases = biases;
    ret->values = values;
    return ret;
}

int main() {
    int nodes[] = {2, 2};
    layer *p1 = create_layer(2, NULL);
    layer *p2 = create_layer(2, p1);
    return 0;
}

编译器:clang 9.0.0

chqrlie

用于计算分配大小的类型在以下情况中不正确:

layer *ret = malloc(sizeof(layer *));  // should be sizeof(layer)

您分配指针的大小,而不是结构的大小。

为避免此类愚蠢的错误,可以直接使用目标指针类型:

layer *ret = malloc(sizeof(*ret));

或者,您可以使用分配包装器宏,并依靠编译器来检测不匹配的类型:

#define ALLOC(t)           ((t *)calloc(1, sizeof(t)))
#define ALLOC_ARRAY(t, n)  ((t *)calloc(n, sizeof(t)))

layer *ret = ALLOC(layer);

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么将文件指针分配给结构指针成员会导致分段错误?

来自分类Dev

c ++通过共享指针将值分配给结构成员会导致SIGSEGV

来自分类Dev

是否将内存分配给typedef结构指针?

来自分类Dev

使用指针将内存分配给结构

来自分类Dev

将内存块分配给结构

来自分类Dev

如何将结构分配给结构的指针数组?

来自分类Dev

将值分配给指针引用的结构的动态分配结构成员数组时,openacc错误

来自分类Dev

将int分配给结构数组,但输出为0(不同)

来自分类Dev

当指向分配的内存的指针分配给结构成员时,需要帮助以生成正确的语法以为char **释放可用内存

来自分类Dev

如何将不同的成员函数指针分配给不同的注册类实例?

来自分类Dev

无法将结构的地址分配给类型为指向该结构的指针的typedef的变量

来自分类Dev

在C中将字符串分配给结构成员(指针)

来自分类Dev

在初始化期间将值分配给动态分配的结构的常量成员

来自分类Dev

在函数中分配内存后将值分配给结构

来自分类Dev

MySQL将数据迁移到完全不同的数据库结构并保持关系完整

来自分类Dev

将结构的指针成员分配为null

来自分类Dev

动态分配和结构-将内存动态分配给结构中的字符串

来自分类Dev

如何根据条件简洁地分配给结构的成员?

来自分类Dev

将值分配给我的结构的char成员时,C分段错误

来自分类Dev

将图像分配给不同的按钮

来自分类Dev

分配给结构的指针类型不兼容

来自分类Dev

如何将数组分配给结构中的指针?

来自分类Dev

尝试将内存分配给结构元素时收到分段错误错误

来自分类Dev

如果我将POD结构分配给另一个POD结构,是否存在内存泄漏?

来自分类Dev

将一个结构分配给另一个结构会导致垃圾回收

来自分类Dev

在结构中分配给结构的语法

来自分类Dev

使用双指针将值分配给struct的成员

来自分类Dev

使用双指针将值分配给struct的成员

来自分类Dev

将枚举成员分配给void指针?

Related 相关文章

  1. 1

    为什么将文件指针分配给结构指针成员会导致分段错误?

  2. 2

    c ++通过共享指针将值分配给结构成员会导致SIGSEGV

  3. 3

    是否将内存分配给typedef结构指针?

  4. 4

    使用指针将内存分配给结构

  5. 5

    将内存块分配给结构

  6. 6

    如何将结构分配给结构的指针数组?

  7. 7

    将值分配给指针引用的结构的动态分配结构成员数组时,openacc错误

  8. 8

    将int分配给结构数组,但输出为0(不同)

  9. 9

    当指向分配的内存的指针分配给结构成员时,需要帮助以生成正确的语法以为char **释放可用内存

  10. 10

    如何将不同的成员函数指针分配给不同的注册类实例?

  11. 11

    无法将结构的地址分配给类型为指向该结构的指针的typedef的变量

  12. 12

    在C中将字符串分配给结构成员(指针)

  13. 13

    在初始化期间将值分配给动态分配的结构的常量成员

  14. 14

    在函数中分配内存后将值分配给结构

  15. 15

    MySQL将数据迁移到完全不同的数据库结构并保持关系完整

  16. 16

    将结构的指针成员分配为null

  17. 17

    动态分配和结构-将内存动态分配给结构中的字符串

  18. 18

    如何根据条件简洁地分配给结构的成员?

  19. 19

    将值分配给我的结构的char成员时,C分段错误

  20. 20

    将图像分配给不同的按钮

  21. 21

    分配给结构的指针类型不兼容

  22. 22

    如何将数组分配给结构中的指针?

  23. 23

    尝试将内存分配给结构元素时收到分段错误错误

  24. 24

    如果我将POD结构分配给另一个POD结构,是否存在内存泄漏?

  25. 25

    将一个结构分配给另一个结构会导致垃圾回收

  26. 26

    在结构中分配给结构的语法

  27. 27

    使用双指针将值分配给struct的成员

  28. 28

    使用双指针将值分配给struct的成员

  29. 29

    将枚举成员分配给void指针?

热门标签

归档