Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 警告:赋值从指针生成整数,不带强制转换、排序参数_C_Arrays_Pointers - Fatal编程技术网

C 警告:赋值从指针生成整数,不带强制转换、排序参数

C 警告:赋值从指针生成整数,不带强制转换、排序参数,c,arrays,pointers,C,Arrays,Pointers,我知道这被问了好几次,但我仍然不完全理解这个问题。 我有一个助手,需要保存和排序参数 int main(int argc, char* argv[]) { int c; char* s = malloc(argc * sizeof(char)); extern char *optarg; extern int optind; extern int optopt; while ( (c = getopt(argc, argv, ":adh"

我知道这被问了好几次,但我仍然不完全理解这个问题。 我有一个助手,需要保存和排序参数

int main(int argc, char* argv[])
{

    int c;
    char* s = malloc(argc * sizeof(char));

    extern char *optarg;


    extern int optind;
    extern int optopt;

    while ( (c = getopt(argc, argv, ":adh")) != -1) {
        s[argc] = argv;
        switch (c) {
            case 'a': printf("a\n");
                      break;
            case 'd': printf("d\n");
                      break;
            case 'h': printf("h\n");
                      break;
        }
    }
    return 0;
}
我知道这与我是否保存指向整数的指针有关

char*argv[]
是什么?指针数组?
s
只是一个字符数组吗

char*argv[]
是什么?指针数组

当这样的声明出现在函数原型中时,如在代码中,它相当于
char**argv
。这是指向
char
的指针。在这种特殊情况下,指向指针是指针数组的第一个元素

s只是一个数组 查斯

正如您已经声明了一个初始化的字符串一样,
s
是指向
char
的指针,特别是,它指向动态分配块中的第一个
char
。您可以通过
s
使用块,就像它是
char
的数组一样,但从技术上讲,它不是数组,
s
肯定不是数组。尽管相关,指针和数组是非常不同的东西

编译器至少应该告诉您错误发生在哪一行,但您没有将该信息传递给我们。不过,我想我能猜到。这条线

s[argc] = argv;
。。。这是胡说八道。由于
s
是指向
char
的指针,
s[argc]
指定一个
char
(在C中,
char
属于整数数据类型)。另一方面,
argv
是一个指针(指向
char
)。尽管C允许指针转换为整数,但这样做很少有用,而且无论如何,一致性程序必须使用转换来执行这种转换。由于您实际上没有对任何内容使用
s
,因此最好的办法可能是删除该行

值得一提的是,如果您想将
s
设置为指向其中一个命令行参数,比如第二个,那么语法应该是

s = argv[2];

(按照惯例,
argv
的第0个元素是程序的名称;参数从索引1开始。)但如果要这样做,则不需要
malloc()
任何
s
内存;无论您为它分配什么,当您为它分配新值时都会泄漏。

char*argv[]
是指向字符串数组的指针。AKA
char**argv

int argc
是命令行上字符串数的整数计数,包括exe名称

还要注意,
argv[]
中每个字符串的长度与argc的值无关。字符串可以短到两个字符,例如
a\0
,也可以长到(或超过)1000个字符

因此语句
char*s=malloc(argc*sizeof(char))不会执行您认为它会执行的操作。
首先,它是表达式的形式,只为一个字符串创建一些空间,而不是其中的
argc

其次,如果您的命令行包含3项(
argc==3
),并且其中一个参数是长度为9的字符串,例如
arguments
,那么
malloc
语句将为1个字符串创建空间,只包含3个字符。不足以包含字符串“arguments\0”,更不用说其他两个了

使用类似以下内容确定
argc
字符串中最长字符串的长度:

int len = 0, lenKeep = 0;
for(i=0;i<argc;i++)
{
    len = strlen(argv[i] > len)
    if(len > lenKeep) lenKeep = len;
}
其中,
Create2DStr(…)
可以定义为:

char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}
char**Create2DStr(ssize\u t numStrings,ssize\u t maxStrLen)
{
int i;
字符**a={0};
a=calloc(numStrings,sizeof(char*));

对于(i=0;i
char*s=malloc(argc*sizeof(char));
->
char**s=malloc(argc*sizeof(char*);
s[argc]
写越界如果设置为argc的大小,为什么s[argc]会越界?数组从0变为n-1,所以数组[n]总是超出范围。是的,行是问题所在。因此s不是动态数组?我需要在其中插入n个命令行参数,然后对其进行排序。s[2]=argv[2]不会将第二个参数保存到s中的第二个保留空间?@AlešKovačIč,C没有“动态数组”因此,正如我所说,如果你动态分配一块内存,并指定
s
指向它,那么你可以通过指针
s
使用该内存,就像它是一个数组一样。这是一个公认的细微区别;除了像我这样的书呆子之外,你可能不需要太注意这个区别nt,诸如
s[2]=argv[2]
之类的赋值仍然错误(需要强制转换,不符合您的目的)因为
s
是指向
char
的指针,而
argv
是指向
char
的指针。就像以前一样,您的间接寻址级别不匹配。如果您想这样做,那么您应该将
s
声明为
char**s
,并分配足够的空间。这就是方法我可能会这样写:
char**s=malloc(argc*sizeof(*s));
char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}