你问的问题
由于您没有显示任何声明,我无法确定,但如果崩溃发生在指定位置,很可能您没有为res
. 你确定你是这样声明的吗?
char res[2][2];
其他问题
我不确定您在第一个循环中要做什么,但是如果标识符argv
引用了传递给的参数,main
例如:
int main (int argc, char *argv[])
argv
将是一个指向字符串的指针数组,而不是包含在这些字符串中的第一个字符的值的数组。因此,您将使用sec
您的操作系统选择的或多或少的随机值填充您的数组,并且它遵循的 ABI 用于存储在该位置传递给您的函数的参数。
基本上您的设置如下所示:
+---------> "my_program"
argv -> +--------------+ / @ anywhere in memory
| argv [0] ------+
+--------------+ +----> "paramter argc-2"
| argv [1] ---------+ / @ another location in memory
+--------------+ \
| ... | / +-----> "paramter 1"
+--------------+ / @ some other location again
| argv[argc-1] |----+
+--------------+
虽然它是@
您正在执行计算的那些位置。
不要误解<<输出
在使用类似的结构时
std::cout << argv[1]
将产生与以下相同的输出:
标准::cout << 12
如果您将程序12
作为第一个参数调用,两者似乎或多或少相同,它们肯定不是!因为只是重载<<
使它们看起来几乎相同。
然而,当在 int 类型的对象上运行时,在切换<<
类型的对象上调用时会切换很多不同的代码。char*
示例的差异
您可能需要检查以下代码段以查看操作上的差异:
#include <iostream>
#include <stdio.h>
int main (int argc, char *argv[]) {
int k;
for (k=0; k<argc; ++k)
std::cout << k << ": " << argv[k] << "\n";
for (k=0; k<argc; ++k)
printf ("%d: %d\n", k, (int) argv[k]);
return 0;
}
运行生成的代码./my_program 12 27 42
将产生如下输出:
0: ./my_program
1: 12
2: 27
3: 42
0: -1079747848
1: -1079747840
2: -1079747837
3: -1079747834
差异很大,这是因为当面对char*
<<
“知道”类型的值时,它必须执行与面对类型值时不同的操作int
。
通过在第二个循环中“告诉”实现要执行的正确操作:
for (k=0; k<argc; ++k)
printf ("%d: %s\n", k, argv[k]);
您将从第二个循环中获得相同的输出。
第一个输出的那些奇怪数字只是将用于表示传递给 main 的参数的指针的位模式解释为整数的那些(位模式)。
改为(无符号)并使用“%x”而不是“%d”会使这一点更加明显,给出如下输出:
0: bf92bae9
1: bf92baf6
2: bf92baf9
3: bf92bafc
正如你所看到的,我通过夸大内存位置的随机性在我的照片中“欺骗”了一点。
如果您计算索引,您会在此示例中发现操作系统只是\0
一个接一个地放置参数(包括终止字符)。