通过指向二维字符数组的指针访问。警告:数组初始值设定项中的元素过多
access via pointer to 2D char array. warning: excess elements in array initializer
我写了两个程序,我认为它们是相同的,但显然它们不是,我不明白为什么。
第一个程序(按预期工作):
#include <stdio.h>
void main()
{
char *p[2][3]={"xyz","wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}
第二个节目:
#include <stdio.h>
void main()
{
char *p[2][3]={{'x','y','z','[=11=]'},"wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}
当我编译这个程序时,我收到警告:数组初始值设定项中的元素过多。
当我 运行 它出现错误时:分段错误(核心已转储)。
显然问题出在 {'x','y','z','\0'} 但我认为它与“xyz”相同。
char *p[2][3]
是char*
数组的数组。每个这样的 char*
都可以用字符串文字初始化。但是,您不能使用数组初始化语法来初始化 char*
,这就是 {'x','y','z','[=15=]'}
。因此代码无法正常工作的原因与
char* str = {'x','y','z','[=10=]'};
不起作用。你会得到“多余的元素”,因为指针只能用一个初始化器初始化,而不是在这种情况下是 4 个。
可以用复合文字初始化它 (char[]){'x','y','z','[=16=]'}
但不推荐,因为复合文字与字符串文字驻留在不同的内存中。
那里有更多警告。
在您的代码中,您正在分配数组元素(并且它们是指向 char 的指针类型),并将 char 值转换为指针。
你需要为此使用复合文字:
int main(void)
{
char *p[2][3]={(char[]){'x','y','z','[=10=]'},"wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}
我写了两个程序,我认为它们是相同的,但显然它们不是,我不明白为什么。
第一个程序(按预期工作):
#include <stdio.h>
void main()
{
char *p[2][3]={"xyz","wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}
第二个节目:
#include <stdio.h>
void main()
{
char *p[2][3]={{'x','y','z','[=11=]'},"wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}
当我编译这个程序时,我收到警告:数组初始值设定项中的元素过多。 当我 运行 它出现错误时:分段错误(核心已转储)。
显然问题出在 {'x','y','z','\0'} 但我认为它与“xyz”相同。
char *p[2][3]
是char*
数组的数组。每个这样的 char*
都可以用字符串文字初始化。但是,您不能使用数组初始化语法来初始化 char*
,这就是 {'x','y','z','[=15=]'}
。因此代码无法正常工作的原因与
char* str = {'x','y','z','[=10=]'};
不起作用。你会得到“多余的元素”,因为指针只能用一个初始化器初始化,而不是在这种情况下是 4 个。
可以用复合文字初始化它 (char[]){'x','y','z','[=16=]'}
但不推荐,因为复合文字与字符串文字驻留在不同的内存中。
那里有更多警告。
在您的代码中,您正在分配数组元素(并且它们是指向 char 的指针类型),并将 char 值转换为指针。
你需要为此使用复合文字:
int main(void)
{
char *p[2][3]={(char[]){'x','y','z','[=10=]'},"wvu","ts","rqponm","lkgihgfe","dcba"};
printf("\n%c\n",(***p)); /*z*/
printf("\n%c\n",((*(*(p+1)+1))[6]));/*f*/
printf("\n%c\n",(**(p[1]+2)));/*d*/
printf("\n%c\n",(**p[1]));/*r*/
printf("\n%c\n",(*(p[1][2]+2)));/*b*/
}