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

Why do command line arguments generate segmentation fault when accessed?

我在尝试逐个字符地读取命令行参数时遇到分段错误。

我有以下代码:

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]!="[=10=]"

您正在将单个字符与字符串常量进行比较。该字符串常量衰减到它存储的地址,这是实际与参数字符串的元素进行比较的地址。结果,因为您没有正确检查终止空字节,所以您读取了字符串的末尾。这样做会触发 undefined behavior,在您的情况下,这会导致您的代码有时崩溃,有时不会。

你在这里想要的是检查值 0:

argv[i][j]!=0