为什么命令行参数在访问时会产生分段错误?
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
我在尝试逐个字符地读取命令行参数时遇到分段错误。
我有以下代码:
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