设置和访问void指针数组

时间:2017-07-24 05:42:25

标签: c pointers

在一块记忆中,treatead为两段,A和B, 我在段A中设置指针,使得值来自 段B可以视为矩阵并通过索引访问:

float **matrix = ( ( void ** ) view->data[ i ] )[ j ];

在分配内存并分配指针之后,然后设置所有 特定矩阵的值。 但是,在尝试打印该矩阵的各个值时, 由于读取无效而导致的程序段错误。 如果我没有调用set_weights函数,则会打印值 很好(和valgrind报告没有泄漏)。所以我假设尝试 设置值有一个不必要的副作用搞乱指针。

我想了解错误是否在指针赋值中 或访问。 皮斯看看并帮助我。

此致 阿尔弗雷德

[OS:x86_64 debian linux,gcc 4.2.9]

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

enum { Weight, Delta, Max };

typedef struct {
    void **data;
} View;

void matrix_2D_print( int x, int y, float **values ) {
    int i, j;
    for( i = 0; i < x; ++i ) {
        for( j = 0; j < y; ++j ) {
            printf( "\t\t%f", values[ i ][ j ] ); // Invalid read
            if( j < ( y - 1 ) ) {
                printf( ", " );
            }
        }
        printf( "\n" );
    }
}

void set_weights( int layers, int x, int y, View *view ) {
    int i, j, l;
    void **view_ptr = view->data[ Weight ];

    for( l = 0; l < layers; ++l ) {
        float **m2_data = view_ptr[ l ];

        for( i = 0; i < x; ++i ) {
            for( j = 0; j < y; ++j ) {
                m2_data[ i ][ j ] = 0.27f;
            }
        }
    }
}

int main( int argc, char **argv ) {
    int i, l, m;
    int x = 3;
    int y = 2;
    int layers = 2;
    size_t step_view = Max * sizeof( void ** );
    size_t len_step_view = x * sizeof( void ** );
    size_t len_segment_A = step_view + x * layers * Max * sizeof( void ** );
    size_t len_segment_B = x * y * layers * Max * sizeof( float );
    char *storage = calloc( 1, len_segment_A + len_segment_B );
    float *segment_b = ( float * )( storage + len_segment_A );
    View view;
    view.data = ( void ** ) storage;

    for( m = 0; m < Max; ++m ) {
        void **segment_a = ( void ** )( storage + step_view );
        view.data[ m ] = segment_a;

        for( l = 0; l < layers; ++l ) {
            segment_a[ l ] = segment_b;
            void **cur = segment_a[ l ];

            for( i = 0; i < x; ++i ) {
                cur[ i ] = segment_b;
                segment_b += y;
            }
            step_view += len_step_view;
        }
    }
    assert( len_segment_A == step_view );
    set_weights( layers, x, y, &view );

    void **view_ptr = view.data[ Weight ];
    printf( "\tLayer: %d\n", 0 );
    matrix_2D_print( x, y, view_ptr[ 0 ] );

    free( storage );
    return 0;
}

0 个答案:

没有答案