typedef struct {
char a[100];
char const *secondHalfOfA;
}
//Can i set { secondHalfOfA = a[49]; } somehow?
答案 0 :(得分:3)
当然可以。
typedef struct {
char a[100];
char const *const secondHalfOfA;
} toto;
#define TOTO_INITIALIZER(NAME) { .secondHalfOfA = &((NAME).a[49]) }
static toto A = TOTO_INITIALIZER(A);
使用像这样的初始化程序一直有额外的优势,它也会使用所有0
初始化数组。
这适用于带有指定初始值设定项的C99。如果你只有历史C,你可以做类似的事情
#define TOTO_INITIALIZER(NAME) { { 0 }, &((NAME).a[49]) }
修改:看到您对其他答案的评论,我认为您的类型const
错误。但真正的C初始化也适用于这种情况。
答案 1 :(得分:2)
您无法自动初始化指向对象中间的指针。
但是,您可以假装有重叠的对象。但它并不漂亮: - )
#include <stdio.h>
#include <string.h>
struct twoparts {
union {
char a[20];
struct {
char dummy[10];
char b[10];
} s;
} u;
};
int main(void) {
struct twoparts x;
strcpy(x.u.a, "1234567890123456789");
printf("second part: %s\n", x.u.s.b);
return 0;
}
答案 2 :(得分:1)
没有。你不能在typedef
中这样做。请记住:使用typedef
关键字定义数据类型,而不是变量。
在C ++中,您可以在默认构造函数中执行此操作。但在C语言中,没有办法做到这一点。
答案 3 :(得分:1)
是Pablo said,你不能用初始化器做到这一点。初始化后你可以很容易地做到这一点,但每次都必须这样做:
// 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