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 | |
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 : 据。
|