【发布时间】:2015-12-17 14:49:06
【问题描述】:
我想在 C 中更改 argv 的值,但我遇到了分段错误。这是代码。
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
for (int i = 1; argv[i]; i++)
{
char *val;
printf("before: %d %s\n", i, argv[i]);
argv[i] = "bar=foo";
printf("after: %d %s\n", i, argv[i]);
char *arg = argv[i];
val = strchr(arg, '=');
*val = '\0';
}
return 0;
}
我正在传递参数 foo=bar(并尝试将第 11 行中的参数更改为 bar=foo)。输出如下所示:
before: 1 foo=bar
after: 1 bar=foo
所以,修改确实发生了,但是*val = '\0'; 行导致了分段错误。
谁能告诉我为什么会这样以及如何预防?
【问题讨论】:
-
如果您只传递 1 个参数,则 argv[i] 仅在 i 取值为 0 时才有效。在您的 for 循环中,您正在检查 argv[1] 作为要查看的谓词的第一次迭代如果你应该继续循环,但这不起作用。
-
@IIIIIIIIIIIIIIIIIIIIIIII
argv[0]始终是程序的名称,如果你传递一个arg,argv[1]是有效的,argv[2]应该是NULL。 -
@Holt
argv[0]可以是NULL。 C11 §5.1.2.2.1 2 -
@Holt: 1)
NULL是一个带有空指针常量的宏。指针不能是宏。它可以是一个空指针,但是,它等于一个空指针常量。 2) 请指出标准规定argv[2]必须是空指针的位置。 -
@Holt:我的立场是正确的。重读标准中的行。 (顺便说一句:我要求提供指向标准的指针,即权威参考)。仅供参考:port70.net/~nsz/c/c11/n1570.html#5.1.2.2.1p2 第二项。
标签: c segmentation-fault argv