Hacker News new | ask | show | jobs
by trealira 585 days ago
In this case, the C declaration doesn't match the other two. The variable x is a function that returns a pointer to an array of 5 pointers to functions returning char. Indeed, that's what cdecl.org says:

  declare x as function returning pointer to array 5 of pointer to function returning char
Using the notation you did, that would be:

  var x: func() ^[5] ^func() char
There are only two arrows there now.

If you wanted a pointer to a function like this, you would need a third asterisk in the declaration:

  char (*(*(*x)())[5])();
1 comments

Oh, good catch, thank you! But I remember an example with some other tricky C expression/type declarator where the number of actual dereferences differed from the amount of asterisks in the code.

> Using the notation you did, that would be:

Well, it'd be

    func x() ^[5] ^func() char; ...
because it's a function declaration, after all, not a variable.
> But I remember an example with some other tricky C expression/type declarator where the number of actual dereferences differed from the amount of asterisks in the code.

Was it this code?

  void f(int *a) {
      void *p = &a;
      ***(int*(*)[])p = 1;
  }
Reading your comment made me think of this. I tried to find the original post for this, but it seems it was deleted. I only found it again through this post: https://zig.news/sobeston/using-zig-and-translate-c-to-under...