C语言 为什么命令行参数在访问时产生分段错误?



当尝试逐字符读取命令行参数时,我得到分段错误。

我有以下代码:

int main(int argc, char** argv)
{
int i,j;
for(i=1;i<argc;i++)
{
for(j=0;argv[i][j]!=0;j++)
{
printf("%c",argv[i][j]);
}
//printf("%c",argv[i][0]);
}
}

这段代码运行,但是当我取消注释printf("%c",argv[i][0]);行时,我得到一个分段错误。为什么这被认为是对未分配内存的访问,我应该如何在不检查其内容的情况下解析命令行参数?

具体来说,我想知道参数的形式是否为:<+->e<0-9A-F>意思是加减号后面跟着"e",后面跟着一个十六进制数字。在c中怎么做呢?

内部循环的条件不正确:

argv[i][j]!=""

将单个字符与字符串常量进行比较。那个字符串常量衰减为它存储的地址,也就是与参数字符串的元素进行比较的地址。因此,由于没有正确检查结束的空字节,因此读取的内容超过了字符串的末尾。这样做会触发未定义的行为,在你的情况下,这会导致你的代码有时崩溃,有时不会。

这里要检查的是值0:

argv[i][j]!=0

最新更新