我怎样才能更简洁地编写这个 C 取消引用?
How can I write this C dereferencing more succinctly?
我有一个函数可以将输入文件解析为单独的页面。 other_func 将行添加到这些页面。这是函数的简化版本。
void func(FILE* f, page** p_pages, int* page_count) {
... do stuff, before passing a line struct and the current page to another function.
page* p = *p_pages;
int n = *page_count - 1;
other_func(line, &p[n]);
}
在最后三行中,我试图传递当前页面的地址。我以为我可以使用 &*p_pages[page_count - 1]
之类的东西来做到这一点,但我似乎无法让它工作(我认为出现 EXC_BAD_ACCESS 错误......)。
有没有更短的方式来写这 3 行?
编辑:添加更多实际代码。
/* struct declarations */
typedef struct page page;
typedef struct line line;
struct page {
char* title;
char* filename;
page* parent;
line* lines;
int numlines;
};
struct line {
char type;
char* text;
};
/* relevant functions */
void addLineToPage(line l, page* p) {
p->numlines++;
p->lines = realloc(p->lines, sizeof(line) * p->numlines);
p->lines[p->numlines - 1] = l;
}
void parse_file(FILE* file, page** p_pages, int* page_count) {
char* rawline = 0;
while( (rawline = p_getline(file)) ) {
char rune = 0;
int n;
sscanf(rawline, "%c %n", &rune, &n);
remove_char(rawline, '\n');
char* text = rawline + n;
if (rune == '\n') {
continue;
} else if (!strchr(PI_RUNES, rune)) {
*page_count = *page_count + 1;
*p_pages = realloc(*p_pages, sizeof(page) * *page_count);
int len = (int) strlen(rawline) + 1;
char* fn = (char*) malloc(len * sizeof(char));
string_to_filename(rawline, fn);
page* p = *p_pages;
int address = *page_count - 1;
p[address] = (page) { .title = rawline, .filename = fn, .parent = NULL, .lines = NULL, .numlines = 0 };
} else {
line l = { .type = rune, .text = text };
addLineToPage(l, *p_pages + *page_count - 1);
}
}
}
您可以使用 &(*p_pages)[*page_count - 1]
或者,正如 alk 指出的那样,等效的 *p_pages + *page_count - 1
.
可以推导如下:p
是*p_pages
,n
是*page_count - 1
,所以直接代入&p[n]
是&(*p_pages)[*page_count - 1]
.
利用 a[b]
是 *(a + b)
的事实,这可以转换为 &*(*p_pages + *page_count - 1)
,也就是 *p_pages + *page_count - 1
.
请注意,将其拆分并没有错,就像您最初所做的那样,但这显示了如何将其表示为单个表达式。
我有一个函数可以将输入文件解析为单独的页面。 other_func 将行添加到这些页面。这是函数的简化版本。
void func(FILE* f, page** p_pages, int* page_count) {
... do stuff, before passing a line struct and the current page to another function.
page* p = *p_pages;
int n = *page_count - 1;
other_func(line, &p[n]);
}
在最后三行中,我试图传递当前页面的地址。我以为我可以使用 &*p_pages[page_count - 1]
之类的东西来做到这一点,但我似乎无法让它工作(我认为出现 EXC_BAD_ACCESS 错误......)。
有没有更短的方式来写这 3 行?
编辑:添加更多实际代码。
/* struct declarations */
typedef struct page page;
typedef struct line line;
struct page {
char* title;
char* filename;
page* parent;
line* lines;
int numlines;
};
struct line {
char type;
char* text;
};
/* relevant functions */
void addLineToPage(line l, page* p) {
p->numlines++;
p->lines = realloc(p->lines, sizeof(line) * p->numlines);
p->lines[p->numlines - 1] = l;
}
void parse_file(FILE* file, page** p_pages, int* page_count) {
char* rawline = 0;
while( (rawline = p_getline(file)) ) {
char rune = 0;
int n;
sscanf(rawline, "%c %n", &rune, &n);
remove_char(rawline, '\n');
char* text = rawline + n;
if (rune == '\n') {
continue;
} else if (!strchr(PI_RUNES, rune)) {
*page_count = *page_count + 1;
*p_pages = realloc(*p_pages, sizeof(page) * *page_count);
int len = (int) strlen(rawline) + 1;
char* fn = (char*) malloc(len * sizeof(char));
string_to_filename(rawline, fn);
page* p = *p_pages;
int address = *page_count - 1;
p[address] = (page) { .title = rawline, .filename = fn, .parent = NULL, .lines = NULL, .numlines = 0 };
} else {
line l = { .type = rune, .text = text };
addLineToPage(l, *p_pages + *page_count - 1);
}
}
}
您可以使用 &(*p_pages)[*page_count - 1]
或者,正如 alk 指出的那样,等效的 *p_pages + *page_count - 1
.
可以推导如下:p
是*p_pages
,n
是*page_count - 1
,所以直接代入&p[n]
是&(*p_pages)[*page_count - 1]
.
利用 a[b]
是 *(a + b)
的事实,这可以转换为 &*(*p_pages + *page_count - 1)
,也就是 *p_pages + *page_count - 1
.
请注意,将其拆分并没有错,就像您最初所做的那样,但这显示了如何将其表示为单个表达式。