C-';字符**';与';字符(*)[6]';

C-';字符**';与';字符(*)[6]';,c,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 ) {

有人能给我解释一下下面的问题是什么,更重要的是为什么

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也指出,常见问题解答涵盖了数组和指针之间的区别:

字符**测试
是指向指针的指针,但如果要获取整个数组的地址,则它需要是指向整个数组的指针,即
char(*test)[6]

test=&array

错误,因为测试的类型为
char**
,而
&array
的类型为
char(*)[6]
,并且与
char**


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

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

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;
}

实际上,这是一个
char(*)[6]
@神秘的一个词:一切:)你的意思是,为什么不允许这种转换?为什么你想要一个
char**test
char[]
?给定
char array[]=“array”,它实际上是一个指向大小为6而不是5的数组的指针,即使问题标题是“5”。是的,jon我修改了这个示例,所以你是对的,它是大小为6而不是5。此外,即使你有正确的指针类型,你也不能修改字符串文字。尽管它可以在一些有问题的旧的PC编译器上运行,但这是一种非常糟糕的做法,并且可能存在未定义的行为(?)。谢谢你的留言。我已经将另一个答案标记为正确,详细说明了这一点,但我喜欢您发布的解决方案。我很好奇,虽然我自己也试过,但有一点变化。。。为什么我不能在没有实际字符计数的情况下执行char(*test)[]之类的操作?如果我不知道怎么办?在这种情况下,您可能只会使用char*。我给这个答案添加了一个例子,这个函数有一个类似于
char**super
的参数,在函数中*super指向一个字符串。我不能做像
*super[0]='Z'
**super='Z'
这样的事情,我想知道我该怎么做。我无法更改参数类型。从技术上讲,*super[0]='Z'可以工作,但很可能您的意思是(*super)[0]='Z'A ha!所以它们都起作用了,这就是令人困惑的地方<代码>*super[0]='Z'
(*super)[0]='Z'
都在测试用例中工作。当然,
*super[1]='Z'
不起作用,因为运算符优先级规则,
(*super)[1]='Z'
起作用。我将为任何处于类似情况的人更新我的问题,我将在编辑中为您评分。再次感谢