微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过指向二维字符数组的指针访问警告:数组初始值设定项中的元素过多

如何解决通过指向二维字符数组的指针访问警告:数组初始值设定项中的元素过多

我写了两个我认为是一样的程序,但显然它们不是,我不知道为什么。

一个程序(按预期工作):

#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','\0'},(*(p[1][2]+2)));/*b*/
}

当我编译这个程序时,我收到一个警告:数组初始值设定项中有多余的元素。 当我运行它时,我收到一个错误:分段错误(核心转储)。

显然问题出在 {'x','\0'} 但我认为它与“xyz”相同。

解决方法

char *p[2][3] 是一个由 char* 组成的数组。每个这样的 char* 都可以用字符串文字初始化。但是,您不能使用数组初始值设定项语法来初始化 char*,这就是 {'x','y','z','\0'}。所以代码不起作用的原因与

相同
char* str = {'x','\0'};

不起作用。你会得到“多余的元素”,因为一个指针只能用一个初始化器初始化,而不是像这种情况下的 4 个。

可以使用复合文字 (char[]){'x','\0'} 对其进行初始化,但不推荐使用,因为该复合文字将驻留在与字符串文字不同的内存中。

,

那里有更多警告。

在您的代码中,您正在分配数组元素(并且它们是指向 char 的指针类型),并将 char 值转换为指针。

您需要为此使用复合文字:

int main(void)
{
    char *p[2][3]={(char[]){'x','\0'},"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*/
}

https://godbolt.org/z/5ofj6q

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。