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 Nonsenstypedef 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; }