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[]
是指向字符串数组的指针。AKAchar**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;ichar*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;
}