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'
起作用。我将为任何处于类似情况的人更新我的问题,我将在编辑中为您评分。再次感谢