我想在为指针分配vaule时,你应该使用*运算符,但我看到了像
这样的代码char *a;
void *b;
b = "Hello";
a = b;
printf("%s", a);
当我编译它并打印Hello时,这是合法的。不需要指向void dereferencing的指针?
答案 0 :(得分:4)
这“有效”,因为void *
和char *
能够容纳任何类型的指针。如果您使用int *a;
代替void *a;
,则可能会遇到麻烦。
但是,您的代码不会取消引用void
指针,并且当printf函数从列表中的变量参数中提取参数时,printf函数会将其转换为char *
。因此,代码中没有取消引用void指针。如果你的指针没有完美地转换为char *
(例如,如果我们有一个int *a;
)在某些类型的机器上没有“额外信息”而没有解决字节的问题(某些机器只有'指向整个机器的单词,并且额外的信息用于存储读取字节时你想要的那个单词中的哪个字节),那么你的printf很可能无法正常运行[“未定义的行为”]。
答案 1 :(得分:1)
C中没有字符串类型。您可以将指向char*
数组开头的char
视为字符串。而这正是printf
在这里对待a
的方式。
据我记忆,C标准要求char*
和void*
可以互换。
答案 2 :(得分:1)
指向void的指针不需要解引用,事实上,取消引用void指针是非法的。您显然可以将任何指针强制转换为void指针,并将void指针强制转换为任何其他指针类型。
这就是原因:
void *b = "hello world";
工作,char *a = b
也工作,然后打印a
。
这里发生的是:
char *a; // declares a as a pointer to char
void *b; // declares b as a void pointer(which can hold an address)
b = "Hello"; // 'b' now holds the address, that points to the start of "Hello"
a = b; // now, 'a' contains the address that 'b' does
printf("%s", a); // prints the string, starting from the address pointed by 'a'.
因此,这是完全合法的。
答案 3 :(得分:0)
b = "Hello";
该行分配了一堆char内存,并将其地址分配给void
指针变量b
。
void指针可以存储任何其他数据类型的地址。 void指针的唯一限制是:
sizeof(void)
是非法的然而,GCC假设sizeof(void)
为1并允许指针算术在void指针上。
a=b;
这是典型的char指针a
,初始化为void指针b
中包含的地址。这是合法的,但如果滥用可能会产生影响。
printf("%s", a);
这是一个简单的printf语句。
此代码中的所有内容都很好。
是的,您需要使用*
为指针中的已分配内存分配值:
例如:
char *c=malloc(sizeof(char));
*c='a';
或
char a='a';
char *c=&a;
*c='b';
在使用双指针时,你也会使用*
来初始化另一个指针。
char *a=NULL;
mymalloc(&a);
void mymalloc(char **a)
{
*a=malloc(10);
return;
}
希望这有帮助。