从char**到char*的赋值中存在不兼容的类型

Incompatible types in assignment char ** to char *

本文关键字:char 不兼容 类型 存在 赋值      更新时间:2023-10-16

我有以下代码:

作为全局变量:

char *orderFiles[10];

然后我的主要方法:

int main(int argc, char *argv[])
{
    orderFiles = argv;
}

然而,它总是给我一个错误。我做错了什么?

它会给您一个错误,因为char *x[10]会给您提供一个由十个字符指针组成的数组,该数组是不可修改的。换句话说,您既不能分配给x,也不能以任何方式更改它。等效的可变版本是char **orderFiles-您可以将argv分配给它。

顺便说一句,可以将单个参数传输到您的数组,因此:

for (i = 0; i <= argc && i < sizeof(orderFiles)/(sizeof(*orderFiles); i++)
    orderFiles[i] = argv[i];

但这似乎相当复杂。它将用第一个N参数填充orderFiles,或者部分填充,使下一个参数为NULL。

如果你的意图只是把论点藏在一个全局中,这样你就可以在任何地方引用它们,那么你应该做这样的事情:

#include <stdio.h>
char **orderFiles;
int orderCount;
static void someFn (void) {
    int i;
    printf ("Count = %dn", orderCount);
    for (i = 0; i < orderCount; i++)
        printf ("%3d: [%s]n", i, orderFiles[i]);
    // or, without orderCount:
    //    for (i = 0; orderFiles[i] != NULL; i++)
    //        printf ("%3d: [%s]n", i, orderFiles[i]);
    //    printf ("Count was %dn", i);
}
int main (int argc, char **argv) {
    orderCount = argc;
    orderFiles = argv;
    someFn();
    return 0;
}

该代码将参数保存到全局变量中,以便在不同的函数中访问它们。

如果您也想使用argc,则应该将两个参数都保存到main中,尽管从技术上讲,这是不必要的,因为argv[argc]在托管环境中保证为NULL,您可以使用它来检测参数数组的末尾。

orderFiles是一个const char **,您不能修改它(数组指针本身)。

您可以尝试分配数组成员(即orderFiles[0]=argv[0],依此类推)。

问题是,初始化时没有长度的数组和初始化时有长度的数组之间存在差异。从全局变量声明中删除10,然后它应该可以工作

原因是argv实际上只是一个char**,但orderFiles是一个由10个char*组成的数组。

orderFiles有一个隐含的char**是,但它是恒定的,因为您通过指定大小[10]将其初始化为链接时间分配的内存块。您应该为数组创建一个非常量char**,或者可能是argv中的memcpy

就像他们都说了两种不同的数据类型。换句话说,可以这样想:argv是一个c字符串数组,您的orderFiles被声明为单个c字符串。

因此,如何分配orderFiles取决于您要做什么。我通常会遍历argv,以将参数传递给应用程序。请注意,argv[0]是应用程序名称。