LINUX.ORG.RU

История изменений

Исправление balsoft, (текущая версия) :

Даже для C это элементарная задача

И, если что, в C вернуть указатель но function-local memory это UB. Может показаться, что это работает, но на самом деле нет!

Вот твой пример, переписанный 1-в-1 на C:

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

struct A {
  int i;
};

struct B {
  struct A * a;
};

struct B create_b(int i) {
  struct A a = { i };

  struct B b = { &a };

  return b;
}

int main() {
  struct B b = create_b(10);

  printf("%d\n", b.a->i);

  void * foo = malloc(1000);

  printf("%d\n", b.a->i);

  free(foo);
}

Наблюдаем и наслаждаемся:

$ clang -O0 main.c -o main && ./main
10
0
$ clang main.c -o main && ./main
257812584
0
$ gcc -O0 main.c -o main && ./main
10
32615
$ gcc main.c -o main && ./main
0
0
$ ./main
1009871352
0
$ ./main
1940232856
0
$ ./main
-628805544
0
$ ./main
-1315733560
0
$ ./main
-998120824
0

Так что то что раст не дает тебе так сделать звучит как огромное преимущество.

Исходная версия balsoft, :

Даже для C это элементарная задача

И, если что, в C вернуть указатель но function-local memory это UB. Может показаться, что это работает, но на самом деле нет!

Вот твой пример, переписанный 1-в-1 на C:

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

struct A {
  int i;
};

struct B {
  struct A * a;
};

struct B create_b(int i) {
  struct A a = { i };

  struct B b = { &a };

  return b;
}

int main() {
  struct B b = create_b(10);

  printf("%d\n", b.a->i);

  void * foo = malloc(1000);

  printf("%d\n", b.a->i);

  free(foo);
}

Наблюдаем и наслаждаемся:

$ clang -O0 main.c -o main && ./main
10
0
$ clang main.c -o main && ./main
257812584
0
$ gcc -O0 main.c -o main && ./main
10
32615
$ gcc main.c -o main && ./main
0
0
$ ./main
1009871352
0
$ ./main
1940232856
0
$ ./main
-628805544
0
$ ./main
-1315733560
0
$ ./main
-998120824
0