静态存储区 字符串 求控制台高手解答
时间: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的位置上,这个变量应该是未初始化的
作者: mozimozillllll 发布时间: 2011-12-07
命令行变个不停,怎么会放到静态去。而且是stdin丢进来的东西,保证是变的
作者: majia2011 发布时间: 2011-12-07
对argv[][]进行复制操作同样会造成程序崩溃
作者: mozimozillllll 发布时间: 2011-12-07
不是静态区的,你在哪看到的静态,书写错了
命令行变个不停,怎么会放到静态去。而且是stdin丢进来的东西,保证是变的
你是说argv指向的内存不是只读段 也就是和平时的“hello”这样的字符串被存储的位置是不一样的是吗
作者: daihenan 发布时间: 2011-12-07
我在自己机器上测试了你给出的第一段代码
对argv[][]进行复制操作同样会造成程序崩溃
你用的是什么版本的编译器?
作者: daihenan 发布时间: 2011-12-07
2如果学过unix,入门的第一课就是这个东西
3如果没判断argc,就想拿着argv[0++]玩,不死也难
作者: majia2011 发布时间: 2011-12-07
1如果是nt,直接反汇编看一下调用堆栈
2如果学过unix,入门的第一课就是这个东西
3如果没判断argc,就想拿着argv[0++]玩,不死也难
1.根本没学过unix
2。控制台项目做的很少
3.求您的详细解答
作者: daihenan 发布时间: 2011-12-07
第一段代码估计是那个家伙用来断参数用的吧,我经常直接丢0覆盖标记位,效率高很多,省得一个个去查。
作者: majia2011 发布时间: 2011-12-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28