我做了这样的事情:
/* convert the argv[1] into Integer and store the result in key
* using library function: strtol() to do it */
char **flag = NULL;
key = strtol(argv[1], flag, 10);
// if argv[1] is not all digits
if (**flag != '\0')
{
printf("Usage: ./caesar key\n");
return 1;
}
但这会引发分段错误。我不知道为什么。
在C文档中,strtol
原型为long int strtol(const char *nptr, char **endptr, int base)
。为什么会出现细分错误?
并更改代码的某些部分时char *flag
,strtol(argv[1], &flag, 10)
及if (*flag != '\0')
如预期一切正常。
我了解(某种程度)如何进行编辑来更正代码。但是,我不知道为什么原始代码不起作用。有人有线索吗?
不知道为什么原始代码不起作用?有人有任何线索吗?
因为这里
char **flag = NULL;
flag
设置为NULL
,然后在这里
key = strtol(argv[1], flag, 10);
flags
的value(NULL
)传递给strtol()
,它不会flags
以任何方式更改,而是NULL
在调用之前和之后strtol()
。
终于在这里
if (**flag != '\0')
flag
具有值的NULL
,将被取消引用,从而调用未定义的行为,这可能导致任何事情,在您的情况下,这是崩溃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句