我有节目
void alloc(char **p)
{
*p=(char*)malloc(sizeof(char)*3);
(*p)[0]='a';
(*p)[1]='f';
(*p)[2]='\0';
}
main()
{
char p[]="hrrgr";
alloc(&p);
printf("%s",p);
}
它什么都不打印。请解释一下。 我知道通过传递char * p;和alloc(& p)将成功。但我的问题的目的是了解我得到的输出。
答案 0 :(得分:2)
这是不允许的:p
是一个包含6个字符的数组,而不是char
指针。您不应将&p
视为char**
指针。
如果您想修复此代码,请将p
声明为char*
,而不是数组:
char *p="hrrgr";
alloc(&p);
答案 1 :(得分:2)
p
是一个包含6个字符的数组。因此p
的类型为char[6]
。 &p
的类型为pointer to char[6] type
,即char (*)[6]
。将数组传递给函数时,它将计算指向其第一个元素的指针。因此,当您将char (*)[6]
类型值传递到alloc
函数时,您将char (*)[6]
类型分配给char **
类型。它们是不兼容的类型,并且具有不同的指针算法。您无法使char (*)[6]
行为像char **
类型一样,即使通过类型转换只能抑制编译器警告。
答案 2 :(得分:1)
&p
的类型为char (*)[6]
,但您的函数alloc
需要类型为char **
的参数。您传递的是错误的类型参数。
答案 3 :(得分:0)
试试这个......
void alloc(char **p)
{
*p=(char*)malloc(sizeof(char)*3);
(*p)[0]='a';
(*p)[1]='f';
(*p)[2]='\0';
}
main()
{
char *p;
alloc(&p);
printf("%s",p);
}
当你声明一个数组时,会有连续的内存分配,但是这里你正在改变起始的3个元素内存,这会改变数组的整个位置并打印垃圾......