Это Пабло сказал , вы не можете сделать это с инициализатором.Вы можете сделать это достаточно легко после инициализации, но это должно происходить каждый раз:
// Definition (once)
typedef struct {
char a[100];
char const *secondHalfOfA;
} TYPENAME;
// Use (each time)
TYPENAME t;
t.secondHalfOfA = &t.a[49];
// Or
TYPENAME *pt;
pt = malloc(sizeof(*pt));
pt->secondHalfOfA = &pt->a[49];
Именно по таким причинам у нас есть объектно-ориентированные языки, такие как C ++ (и Java и ...) и связанные с ними конструкторы , чтобы мы могли надежно создавать структуры с пользовательскими инициализациями.
Демонстрационная программа:
#include <stdio.h>
// Definition (once)
typedef struct {
char a[100];
char const *secondHalfOfA;
} TYPENAME;
int main(int argc, char* argv[])
{
// Use of the type (need to initialize it each time)
TYPENAME t;
t.secondHalfOfA = &t.a[49];
// Example actual use of the array
t.a[49] = 'A';
printf("%c\n", *t.secondHalfOfA); // Prints A
// Uncommenting the below causes a compiler error:
// "error: assignment of read-only location ‘*t.secondHalfOfA’"
// (That's gcc's wording; your compiler will say something similar)
//*t.secondHalfOfA = 'B';
//printf("%c\n", *t.secondHalfOfA);
return 0;
}
Компиляция и вывод с использованием gcc:
$ gcc -Wall temp.c
$ ./a.out
A