由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个char * 的问题
相关主题
问个缺少逗号的数组赋值问题数组定义的时候,分配空间了么?
问个指针array 的简单问题请教一道入门小题
c里全局数组的再次赋值问题R似乎根本就没有认真考虑过global variable的改写问题
C 语言,初学者,简单问题(2)reverse words, not the Microsoft one!!!
问个char*的问题c++ 得最基本问题
问个c语言的问题来,出个题
C++ pointer to function is buggy一个hash table的简单问题
char *p = "string literal"; 和 char a[] = "string liter (转载)请教什么时候变量会被load进stack,什么时候进入heap呢?
相关话题的讨论汇总
话题: char话题: ab话题: test话题: typeid话题: literal
进入Programming版参与讨论
1 (共1页)
B*******g
发帖数: 1593
1
char test[] = "AB";
char * a = "AB";
char * b = test;
这里面literal string (a) 和 char array (b)使用起来有没有区别?
我知道a[0] = a[1];会产生run time error, b[0]=b[1];却可以
莫非a[0]返回的是char const & 而b[0]是 char &?如果你不知道 a,b如何赋值的话有
没有办法
知道他们是literal string还是char array?
z****e
发帖数: 2024
2
cout< cout<
U********d
发帖数: 577
3
这个和编译有关,几乎所有的编译器都会将[]=""内容放在设定为rw的栈上,而把char
*x="xx"中的xx放在静态数据区而设定为r。
这样就可以解释你的问题了,对于char test[] = "AB";执行的时候确实在栈上面分配
了3个字节的内存,这部分地址是可读写的,而且在test的生命周期内这部分内容你可
以随意读写。但是对于char * a = "AB";这里的AB不是放在栈上,而是放在全局数据段
,这里的a在32位操作系统下只是一个4字节的指针,指向这个只具有r属性的全局数据。
C在编译的时候并不检查读写权限或者越界之类的事情,所以编译没有问题。但是在运
行的时候,a[0] = a[1];对一个r属性全局数据段的数据进行写操作,所以会挂掉。b=
test后b[x]=x的操作是对栈上rw的数据操作,所以没有问题。
B*******g
发帖数: 1593
4
但test我看定义也知道是char array
char test[] = "AB";
char * a = "AB";
char * b = test;
typeid() a 或b 都是 char *
问题是
b[0]=b[1]; 运行通过但是
a[0]=a[1]; 就报exception .........Access violation writing location
0x009d7854
我猜原因是a[] 返回的是 char const &..而b[]返回的是 char &;或者是别的原因?

【在 z****e 的大作中提到】
: cout<: cout<
B*******g
发帖数: 1593
5
啊啊啊,解释的不错 thx
那还有个问题 如果给出两个char *的话怎么知道它们指向的是rw的stack还是r only的
全局

char
据。

【在 U********d 的大作中提到】
: 这个和编译有关,几乎所有的编译器都会将[]=""内容放在设定为rw的栈上,而把char
: *x="xx"中的xx放在静态数据区而设定为r。
: 这样就可以解释你的问题了,对于char test[] = "AB";执行的时候确实在栈上面分配
: 了3个字节的内存,这部分地址是可读写的,而且在test的生命周期内这部分内容你可
: 以随意读写。但是对于char * a = "AB";这里的AB不是放在栈上,而是放在全局数据段
: ,这里的a在32位操作系统下只是一个4字节的指针,指向这个只具有r属性的全局数据。
: C在编译的时候并不检查读写权限或者越界之类的事情,所以编译没有问题。但是在运
: 行的时候,a[0] = a[1];对一个r属性全局数据段的数据进行写操作,所以会挂掉。b=
: test后b[x]=x的操作是对栈上rw的数据操作,所以没有问题。

U********d
发帖数: 577
6
如果没有上下文光秃秃给你两个char*那就真的没有办法了,typeid什么的都没有办法
。不过你可以考虑try catch来测试一下,如果实在有必要的话。
还有一种杀鸡用牛刀的方法是取一下指向地址的内存属性。

【在 B*******g 的大作中提到】
: 啊啊啊,解释的不错 thx
: 那还有个问题 如果给出两个char *的话怎么知道它们指向的是rw的stack还是r only的
: 全局
:
: char
: 据。

z****e
发帖数: 2024
7
赞。

char
据。

【在 U********d 的大作中提到】
: 这个和编译有关,几乎所有的编译器都会将[]=""内容放在设定为rw的栈上,而把char
: *x="xx"中的xx放在静态数据区而设定为r。
: 这样就可以解释你的问题了,对于char test[] = "AB";执行的时候确实在栈上面分配
: 了3个字节的内存,这部分地址是可读写的,而且在test的生命周期内这部分内容你可
: 以随意读写。但是对于char * a = "AB";这里的AB不是放在栈上,而是放在全局数据段
: ,这里的a在32位操作系统下只是一个4字节的指针,指向这个只具有r属性的全局数据。
: C在编译的时候并不检查读写权限或者越界之类的事情,所以编译没有问题。但是在运
: 行的时候,a[0] = a[1];对一个r属性全局数据段的数据进行写操作,所以会挂掉。b=
: test后b[x]=x的操作是对栈上rw的数据操作,所以没有问题。

t****t
发帖数: 6806
8
if you are facing this kind of question, your design has problem.

【在 B*******g 的大作中提到】
: 啊啊啊,解释的不错 thx
: 那还有个问题 如果给出两个char *的话怎么知道它们指向的是rw的stack还是r only的
: 全局
:
: char
: 据。

U********d
发帖数: 577
9
如果面临这样的问题,除了初学者设计有问题外,还有可能是给别人的代码擦屁股,或
者一些特殊的场合。人家来问问题的,别一棍子给打死了你说是吧。

【在 t****t 的大作中提到】
: if you are facing this kind of question, your design has problem.
h*******c
发帖数: 248
10
这个专业。我的粗浅理解是,没分配内存的指针不能乱用。

char
据。

【在 U********d 的大作中提到】
: 这个和编译有关,几乎所有的编译器都会将[]=""内容放在设定为rw的栈上,而把char
: *x="xx"中的xx放在静态数据区而设定为r。
: 这样就可以解释你的问题了,对于char test[] = "AB";执行的时候确实在栈上面分配
: 了3个字节的内存,这部分地址是可读写的,而且在test的生命周期内这部分内容你可
: 以随意读写。但是对于char * a = "AB";这里的AB不是放在栈上,而是放在全局数据段
: ,这里的a在32位操作系统下只是一个4字节的指针,指向这个只具有r属性的全局数据。
: C在编译的时候并不检查读写权限或者越界之类的事情,所以编译没有问题。但是在运
: 行的时候,a[0] = a[1];对一个r属性全局数据段的数据进行写操作,所以会挂掉。b=
: test后b[x]=x的操作是对栈上rw的数据操作,所以没有问题。

h*****0
发帖数: 4889
11
没办法,C语言这就是悲剧。

【在 B*******g 的大作中提到】
: 啊啊啊,解释的不错 thx
: 那还有个问题 如果给出两个char *的话怎么知道它们指向的是rw的stack还是r only的
: 全局
:
: char
: 据。

1 (共1页)
进入Programming版参与讨论
相关主题
请教什么时候变量会被load进stack,什么时候进入heap呢?问个char*的问题
问一个C语言中类型cast的问题问个c语言的问题
question about shiftC++ pointer to function is buggy
一个指向指针的指针的引用?char *p = "string literal"; 和 char a[] = "string liter (转载)
问个缺少逗号的数组赋值问题数组定义的时候,分配空间了么?
问个指针array 的简单问题请教一道入门小题
c里全局数组的再次赋值问题R似乎根本就没有认真考虑过global variable的改写问题
C 语言,初学者,简单问题(2)reverse words, not the Microsoft one!!!
相关话题的讨论汇总
话题: char话题: ab话题: test话题: typeid话题: literal