C - 'char **'与'char(*)[6]'的间接等级不同

时间:2011-09-23 03:57:39

标签: c

有人可以向我解释以下内容有什么问题,更重要的是为什么?

int main( int argc, char *argv[] )
{
    char array[] = "array";
    char **test;
    test = &array;

    *test[0] = 'Z';

    printf( "%s\n", array );

    return 0;
}

修改

我上面的例子基于这样一个崩溃的函数:

void apple( char **pp )
{
    *pp = malloc( 123 );
    *pp[0] = 'a'; // technically this is correct but in bad form
    *pp[1] = 'b'; // incorrect but no crash
    *pp[2] = '\0'; // incorrect and crash
}

正如Vaughn Cato向我指出的那样虽然*pp[0] = 'a';没有崩溃,但它的状态还不好。正确的形式是括号

void apple( char **pp )
{
    *pp = malloc( 123 );
    (*pp)[0] = 'a'; // correct
    (*pp)[1] = 'b'; // correct
    (*pp)[2] = '\0'; // correct
}

另外作为另一张海报,MK指出FAQ涵盖了数组和指针之间的区别: http://www.lysator.liu.se/c/c-faq/c-2.html

3 个答案:

答案 0 :(得分:11)

test = &array

是错误的,因为测试的类型为char**&arraychar(*)[6],且与char**的类型不同

数组与char*的类型不同,尽管C会在某些上下文中隐式转换数组类型和char*,但这不是其中之一。基本上期望char*与数组的类型相同(例如:char[6])是错误的,因此期望获取数组的地址将导致char**是也错了。

答案 1 :(得分:3)

这将是您尝试做的事情的方式:

int main( int argc, char *argv[] )
{
  char array[] = "array";
  char (*test)[6];
  test = &array;

  (*test)[0] = 'Z';

  printf( "%s\n", array );

  return 0;
}

test是一个指向数组的指针,一个数组与指针不同,即使C在我的情况下很容易使用另一个数组。

如果您想避免指定特定大小的数组,可以使用其他方法:

int main( int argc, char *argv[] )
{
  char array[] = "array";
  char *test;
  test = array;  // same as test = &array[0];

  test[0] = 'Z';

  printf( "%s\n", array );

  return 0;
}

答案 2 :(得分:1)

char **test;是一个指向指针的指针,但是如果你要获取整个数组的地址,那么它需要是一个指向整个数组的指针,即char (*test)[6];