有人可以向我解释下面的问题是什么,更重要的是为什么?
int main( int argc, char *argv[] )
{
char array[] = "array";
char **test;
test = &array;
*test[0] = 'Z';
printf( "%s\n", array );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑
我上面的例子基于这样一个崩溃的函数:
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
}
Run Code Online (Sandbox Code Playgroud)
正如Vaughn Cato向我指出的那样虽然*pp[0] = 'a';没有崩溃,但它的状态还不好.正确的形式是括号
void apple( char **pp )
{
*pp = malloc( 123 );
(*pp)[0] = 'a'; // correct
(*pp)[1] = 'b'; // correct
(*pp)[2] = '\0'; // correct
}
Run Code Online (Sandbox Code Playgroud)
另外作为另一张海报,MK指出FAQ涵盖了数组和指针之间的区别:http: //www.lysator.liu.se/c/c-faq/c-2.html
sas*_*ang 11
test = &array
是错误的,因为测试是类型的char**,&array是一个char(*)[6]和不同的类型char**
数组的类型不同,char*尽管C将在数组类型和char*某些上下文之间隐式转换,但这不是其中之一.基本上char*,与数组类型(例如char[6]:)的期望是错误的,因此期望获取数组的地址将导致a char**也是错误的.
这将是做你似乎想做的事情的方法:
int main( int argc, char *argv[] )
{
char array[] = "array";
char (*test)[6];
test = &array;
(*test)[0] = 'Z';
printf( "%s\n", array );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)