2012-06-13 19 views
33

所以我想知道如果命令行参数总是空终止?谷歌似乎说是,并且在海湾合作委员会编译表明情况是这样,但我可以保证这永远是真实的吗?主空null中的char * argv []参数是否终止?

int main(int argc, char** argv) 
{ 
    char *p; 

    for(int cnt=1; cnt < argc; ++cnt) 
    { 
     p = argv[cnt]; 
     printf("%d = [%s]\n", cnt, p); 
    } 
    return 0; 
} 

$ MyProgram -arg1 -arg2 -arg3 
1 = -arg1 
2 = -arg2 
3 = -arg3 
+4

是的,这是事实。 – kol

+2

想了一会儿:*如果它们不是NULL终止,会发生什么情况?* –

+0

想了一分钟...... char []和char *不会自动暗示C风格的字符串。 很显然,整个命令行字符串是NULL终止的,但不必转换为在命令行上传递的每个单独字符数组都是NULL终止。 对于argv来说,在命令行中删除空白并且具有非空终止字符数组而非C风格字符串将很容易。 – LeviX

回答

56

是的。 argv数组中的指针指向C字符串,它们通过定义空终止。

C语言标准只是声明数组成员“应包含指向字符串的指针”(C99§5.1.2.2.1/ 2)。一个字符串是“一个由第一个空字符终止并且包含第一个空字符的连续字符序列”(C99§7.1.1/ 1),也就是说,它们是按定义终止的。

此外,argv[argc]的数组元素是一个空指针,所以在某种意义上,数组本身也是“null终止”。

+0

如果argv为空终止,您能解释argc的用法吗?我们不能检测到没有。通过遍历数组的参数,直到达到'\ 0'..? – Snehasish

+0

@Snehasish是的,你可以从'argv'计算'argc'。至于为什么'main'有它的签名,我不知道。在我存在之前就是这样。 –

+0

我想那么,它的历史原因... – Snehasish

4

是的,参数总是空的终止字符串。

相关问题