此示例用于演示,但我需要像示例
中一样强制转换指针我收到以下错误:
test2.c: In function ‘main’:
test2.c:25:12: error: expected identifier before ‘(’ token
test2.c:25:12: error: too few arguments to function ‘strcpy’
test2.c:26:20: error: expected identifier before ‘(’ token
代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct test {
void *ptr;
char str[300];
};
struct test2 {
int i;
char astr[200];
};
int main(void)
{
struct test *p;
p = malloc(sizeof(struct test));
p->ptr = malloc(sizeof(struct test2));
/*
void *p2;
p2 = p->ptr;
strcpy(((struct test2 *)p2)->astr, "hello world");
printf("%s\n", ((struct test2 *)p2)->astr);
*/
strcpy(p->(struct test2 *)ptr->astr, "hello world");
printf("%s\n", p->(struct test2 *)ptr->astr);
return 0;
}
代码的注释部分效果很好。我知道处理器不能在没有附加变量的情况下取消引用指针,编译器会创建一个额外的变量,但我想了解如何在不创建额外变量的情况下强制嵌套在结构中的指针?
为了使代码看起来更紧凑,我经常会使用类似的东西,并且我想在没有其他变量的情况下将其写入一行。
答案 0 :(得分:2)
C ++变体:
strcpy(reinterpret_cast<struct test2 *>(p->ptr)->astr, "hello world");
值得指出的是,strcpy
函数不安全,不应使用。请改用strcpy_s
。
答案 1 :(得分:2)
您需要将->
应用于演员表的结果(注意整个演员表达式周围的括号):
strcpy(((struct test2 *)(p->ptr))->astr, "hello world");
printf("%s\n", ((struct test2 *)(p->ptr))->astr);