c - Can I do what I want with allocated memory -
are there limits on can allocated memory?(standard-wise)
for example
#include <stdio.h> #include <stdlib.h> struct str{ long long a; long b; }; int main(void) { long *x = calloc(4,sizeof(long)); x[0] = 2; x[3] = 7; //is beyond here legal( if exclude possible illegal operations) long long *y = x; printf("%lld\n",y[0]); y[0] = 2; memset (x,0,16); struct str *bar = x; bar->b = 4; printf("%lld\n",bar->a); return 0; } to summarize:
- can recast pointer other datatypes , structs, long size fits?
- can read before write, then?
- if not can read after wrote?
- can use struct smaller allocated memory?
reading y[0] violates strict aliasing rule. use lvalue of type long long read objects of effective type long.
assuming omit line; next troublesome part memset(x,0,16);. this answer argues memset not update effective type. standard not clear.
assuming memset leaves effective type unchanged; next issue read of bar->a.
the c standard unclear on too. people bar->a implies (*bar).a , strict aliasing violation because did not write bar object location first.
others (including me) fine: lvalue used access bar->a; lvalue of type long long, , accesses object of effective type long long (the 1 written y[0] = 2;).
there c2x working group working on improving specification of strict aliasing clarify these issues.
Comments
Post a Comment