假设我有以下C文件,我将其编译为可执行文件test
:
#include <stdio.h>
int main(int argc, char **argv) {
// do some computation
}
假设我使用调用./test foo
从命令行调用此二进制文件。那时,argv[0]
的值是否等于"foo"
,还是等于内存中的某个地址?
答案 0 :(得分:4)
argv[0]
将地址保存在字符串“./test”的内存中。 argv[1]
将保存字符串“foo”的内存地址。
char*
是指向单个字符的指针。您可以将该指针指向一个字符,就像它是一个字符串一样(如果数据是NUL终止的话,更容易)。但它的核心是一个指向包含字符数据的内存的指针。
char**
是指向char*
的指针。在这种情况下,我们将char**
视为char*
的数组。但实际上它只是一个指向内存地址的指针,该地址包含char*
。
答案 1 :(得分:1)
argc
值和argv[]
char指针数组以及argv[]
指针指向的字符串都在readonly内存中。所以不要试图以任何方式修改它们。
argv[0]
是指向字符串的char指针。
字符串内容为:"test"
,包括尾随'\0'
。
argv[1]
是指向字符串的char指针。
字符串内容为:"foo"
,包括尾随'\0'
。
argv[2]
是一个char指针。
该指针将包含NULL
。
argc
是一个整数。
该整数将包含2。
因为argc
包含argv[]
数组中有效指针数的计数
(最终的NULL
指针不计算在内)