undefined behavior mit buffer



  • hi,

    kann mir jemand sagen warum folgendes program undefined behavior erzeugt? wie kann ich das 2d array als pointer der structur uebergeben?

    #include <stdio.h>
    
    typedef struct foo foo;
    
    float buff[5000][2];
    
    struct foo {
    	float *buff_ptr;
    };
    
    foo NewFoo(float *buff_ptr_) {
    	foo f;
    	f.buff_ptr = buff_ptr_;
    	return f;
    }
    
    float getData(foo *f, int i, int j, const int col_size) {
    	return *((f->buff_ptr + i * col_size) + j);
    }
    
    void setData(foo *f, int i, int j, const int col_size, const float val) {
    	*((f->buff_ptr + i * col_size) + j) = val;
    }
    
    int main() 
    {
    	foo f = NewFoo(*buff);
    
    	int i = 0;
    	for (i = 0; i < 100; i++) {
    		buff[i][1] = i;
    		//setData(&f, i, 1, 100, i);
    	}
    
    	for (i = 0; i < 100; i++) {
    		printf("%f\n", getData(&f, i, 1, 100));
    	}
    
        return 0;
    }
    


  • - wo soll hier UB sein (solange dein Index innerhalb von 5000*2 liegt)
    - nur Deppen benutzen globale Variablen
    - const Basistypen im Funktionsprototyp sind Nonsens

    typedef struct foo foo;
    
    struct foo {
        float (*buff_ptr)[2];
    };
    
    float getData(foo *f, int i, int j) {
        return f->buff_ptr[i][j];
    }
    
    float setData(foo *f, int i, int j,float k) {
        return f->buff_ptr[i][j]=k;
    }
    
    int main()
    {
    	float buff[5000][2];
        foo f = {buff};
    
        int i = 0;
        for (i = 0; i < 100; i++) {
            setData(&f, i, 1, i);
        }
    
        for (i = 0; i < 100; i++) {
            printf("%f\n", getData(&f, i, 1));
        }
    
        return 0;
    }
    


  • @Wutz:
    kann ich fuer folgendes nur einen pointer definieren?

    struct foo {
        float (*buff_ptr)[2];
    };
    


  • folgender code funktioniert nun, bitte um feedback:

    #include <stdio.h>
    
    typedef struct foo foo; 
    
    struct foo { 
        float *buff_ptr;
        int cols;
    }; 
    
    foo NewFoo(float *buff_ptr_, int cols_) {
    	foo f;
    	f.buff_ptr = buff_ptr_;
    	f.cols = cols_;
    	return f;
    }
    
    float getData(foo *f, int i, int j) { 
        return *((f->buff_ptr + i * f->cols) + j);
    } 
    
    float setData(foo *f, int i, int j,float val) { 
        *((f->buff_ptr + i * f->cols) + j) = val; 
    } 
    
    int main() 
    { 
        float buff[2][5000]; 
        foo f = NewFoo(buff, 5000); 
    
        int i = 0; 
        for (i = 0; i < 100; i++) { 
            //setData(&f, 1, i, i);
            buff[1][i] = i;
        } 
    
        for (i = 0; i < 100; i++) { 
            printf("%f\n", getData(&f, 1, i)); 
        } 
    
        return 0; 
    }
    

Anmelden zum Antworten