在看的时候:
我想出了以下代码:(
忽略此示例中未释放内存的事实。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *cstr;
size_t len;
} str_t;
void setStr(str_t* dest, const char* src)
{
size_t len = strlen(src);
dest->cstr = malloc(len + 1);
dest->len = len;
memcpy(dest->cstr, src, len + 1);
}
int main(void)
{
str_t str;
setStr(&str, "woot!");
printf("%s\n", str);
return 0;
}
令人惊讶的是,这确实有效。这个电话:
printf("%s\n", str);
似乎相当于这个:
printf("%s\n", str.cstr);
所以有人会认为以下也是可能的:
char* plainstr = malloc(str.len + 1);
strcpy(plainstr, str);
但是不行。相反,printf
,strcpy
不是可变参数,所以有类型检查。编译器理所当然地抱怨:
passing 'str_t' to parameter of incompatible type 'const char *'
但是试图通过强制转换来告诉编译器“我是认真的”:
strcpy(plainstr, (const char*)str);
也不行:
operand of type 'str_t' where arithmetic or pointer type is required
请注意,以下内容不起作用:
strcpy(plainstr, (const char*)&str);
由于str.cstr != &str
. 例如,这个的输出:
printf("%p %p\n", str.cstr, &str);
是否如下:
0xbdb010 0x7fff788f6ab8
事实上,垃圾数据正在被复制到plainstr
.
所以问题是:
- 为什么不允许将结构转换为指针类型?
printf
如果不允许投射,怎么能正确处理这个问题?