更改常量指针的内存位置

时间:2014-02-22 21:51:31

标签: c pointers

我有节目

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)将成功。但我的问题的目的是了解我得到的输出。

4 个答案:

答案 0 :(得分:2)

这是不允许的:p是一个包含6个字符的数组,而不是char指针。您不应将&p视为char**指针。

如果您想修复此代码,请将p声明为char*,而不是数组:

char *p="hrrgr";
alloc(&p);

Running demo on ideone.

答案 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个元素内存,这会改变数组的整个位置并打印垃圾......