在这一点上,这更像是一个概念性的问题,而不是一个实际问题,但它确实困扰着我 .
让我们说我有一个名为“test.c”的c程序,我想找到数组中的空格数,用户输入的单词作为参数 . 例如,“ . / test.c test_run”应该打印9,因为有8个字符,然后一个用于空终止字符 . 当我尝试在argv上使用sizeof时虽然我遇到了麻烦 .
int main(int argc, char *argv[]) {
char buf10[10];
printf("The size of buf10 is: %i.\n", sizeof(buf10));
return 0;
}
打印结果:“ The size of buf10 is: 10. ” . 这是有道理的,因为我选择了一个char数组 . 在C中,char的大小是1个字节 . 如果我选择int,这个数字将是4 .
现在我的问题是为什么我不能用argv这样做?
int main(int argc, char *argv[]) {
printf("argv[1] has the value: %s\n", argv[1]);
printf("strlen of argv[1] is: %i\n", strlen(argv[1]));
printf("sizeof of argv[1] is: %i\n", sizeof(argv[1]));
return 0;
}
使用“./test Hello_SO”进行输出:
argv[1] has the value: Hello_SO
strlen of argv[1] is: 8
sizeof of argv[1] is: 4
字符串长度是有意义的,因为它应该是9但减去“\ 0”使得8 .
但是我不明白为什么sizeof返回4(指针的大小) . 我知道* argv []可以被认为是** argv . 但我已经说明了这一点 . 在我的第一个例子中,我打印“buf”,但在这里我打印“argv [1]” . 我知道我可以通过使用strlen轻松得到答案,但正如我之前所说,这只是概念性的 .
2 回答
指针和数组不是一回事,尽管在很多情况下它们非常相似 .
sizeof
是一个关键的区别 .上面
arr
的类型是int[10]
. 查看数组类型和指针之间差异的另一种方法是尝试分配它们 .数组无法分配 .
最令人困惑的是,当你有一个数组作为一个函数参数时,实际上它有一个指针 .
为了解决为什么你不能使用
sizeof argv[1]
并获得字符串大小(加上\0
的1)的问题,'s because it'是一个不规则的数组 . 在这种情况下,第一个维度的大小不明,第二个维度也是如此 . 在这种情况下,sizeof
的行为类似于编译时操作,并且直到运行时才知道字符串的长度 .考虑以下程序:
为此生成的程序集是:
正如您所看到的,
sizeof argv[1]
的结果是在编译时完成的,上面没有任何内容计算字符串的长度 . 我是64位所以我的指针是8个字节 .buf10变量在编译时是已知的,是一个由10个字符组成的(连续)数组 . 其他指针是动态分配的,并且是指向字符的指针 . 这就是为什么你得到字符数组的大小vs sizeof(char *) .