+ -
当前位置:首页 → 问答吧 → 静态存储区 字符串 求控制台高手解答

静态存储区 字符串 求控制台高手解答

时间:2011-12-07

来源:互联网

今天看到一个前辈写的代码 搞不懂了 大概是这样的
int _tmain(int argc, char *argv[]) 

argv[2][1] = ' ';
  ........
  ........
return 0;


我就纳闷儿了 argv[2]这个东西 是个char* 它是个c风格的字符串类型 argv[2]指向的字符串不是放在静态存储区的只读段中的吗 为啥还可以对只读段进行写操作呢??

下面是自己做的测试
int _tmain(int argc, char *argv[]) 

char * str[] = {"hello", "world"};
  char ** p = str;
p[1][2] = '2';
return 0;


测试程序崩溃,原因是对只读段内存进行了写操作!!!!!测试中的p就相当于上面的argv了(因为char* argv[]作为参数的时候已经被退化成了char**)

哪位控制台的高手告诉我原因啊!!!!!!

作者: daihenan   发布时间: 2011-12-07

argv的赋值发生在哪一时刻呢?
应该是通过控制台传入参数的时候吧
在你给出的第一段代码里argv的位置上,这个变量应该是未初始化的

作者: mozimozillllll   发布时间: 2011-12-07

不是静态区的,你在哪看到的静态,书写错了

命令行变个不停,怎么会放到静态去。而且是stdin丢进来的东西,保证是变的

作者: majia2011   发布时间: 2011-12-07

我在自己机器上测试了你给出的第一段代码

对argv[][]进行复制操作同样会造成程序崩溃

作者: mozimozillllll   发布时间: 2011-12-07

引用 2 楼 majia2011 的回复:
不是静态区的,你在哪看到的静态,书写错了

命令行变个不停,怎么会放到静态去。而且是stdin丢进来的东西,保证是变的


你是说argv指向的内存不是只读段 也就是和平时的“hello”这样的字符串被存储的位置是不一样的是吗

作者: daihenan   发布时间: 2011-12-07

引用 3 楼 mozimozillllll 的回复:
我在自己机器上测试了你给出的第一段代码

对argv[][]进行复制操作同样会造成程序崩溃


你用的是什么版本的编译器?

作者: daihenan   发布时间: 2011-12-07

1如果是nt,直接反汇编看一下调用堆栈
2如果学过unix,入门的第一课就是这个东西
3如果没判断argc,就想拿着argv[0++]玩,不死也难

作者: majia2011   发布时间: 2011-12-07

引用 6 楼 majia2011 的回复:
1如果是nt,直接反汇编看一下调用堆栈
2如果学过unix,入门的第一课就是这个东西
3如果没判断argc,就想拿着argv[0++]玩,不死也难


1.根本没学过unix
2。控制台项目做的很少
3.求您的详细解答

作者: daihenan   发布时间: 2011-12-07

如果你没输入参数,就跑了个程序,系统也就没有给argv[1]空间放东西,你还要用这个,当然会有问题。

第一段代码估计是那个家伙用来断参数用的吧,我经常直接丢0覆盖标记位,效率高很多,省得一个个去查。

作者: majia2011   发布时间: 2011-12-07