首页 > 试题广场 >

下面叙述错误的是()

[单选题]
下面叙述错误的是( )
char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";

  • acX与acY的内容可以修改
  • szX与szY指向相同的地址
  • acX占用的内存空间比acY占用的大
  • szX的内容修改后,szY的内容也会被更改
正确答案应该选D,而不是选B
char *szX = "abc";与char *szY = "abc";
"abc"是保存在文字常量区,属于字符串常量,所以该数据不能修改,默认是只读属性。
因此不能通过指针szX或szY的指向来修改此值,而且szX和szY指向字符串常量"abc"相同的地址,可推出选D而不选B。

char acX[] = "abc";
"abc"是保存在栈空间数组里. 其数组名为acX,,数组名为数组的首地址(属于指针常量),
因此可以通过 acX[i] = 'x' 或 *(acX+i) = 'x' 的形式来修改数组内容。
编辑于 2017-07-09 13:01:44 回复(8)
B选项:szX与szY指向相同的地址,这句话是正确的。
对于有人说打印出来的地址相同,可能是打印了指针的地址。
#include <stdio.h>
void main(void)
{
    char *x = "abcd";
    char *y = "abcd";
    //打印指针所指向的地址
    printf("%p\n", x);
    printf("%p\n", y);
    //打印指针的地址
    printf("%p\n", &x);
    printf("%p\n", &y);
}

执行结果:
0x400624
0x400624
0x7ffc3f2b3560
0x7ffc3f2b3568

发表于 2017-07-21 11:33:58 回复(0)
szX和szY指向的是字符串常量 不能被改变
发表于 2018-05-06 17:53:32 回复(0)
这道题出的并不好。
选项B:
szX与szY指向相同的地址。
因为他们都指向相同的字符串常量,但是没有任何规定若字符串指针指向的常量相同,则他们必然在代码段存在且只存在一份。这种情况只出现在编译器优化后的结果,显然保存两份相同的字符串常量是愚蠢的行为,所以编译器优化后,两个指针指向了同一份字符串常量。
选项D:
szX的内容修改后,szY的内容也会被修改。
并不是不能修改 ,而是修改字符串字面量的结果是未定义的。这意味着 ,可能这个编译器可以修改,可能换一个编译器就不能修改。我们参考C99的标准:
C99标准(6.7.8.32):
On the other hand, the declaration
char *p = "abc";
defines p with type ‘‘pointer to char’’ and initializes it to point to an object with type ‘‘array of char’’ with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to modify the contents of the array, the behavior is undefined.
这道题出的不好的原因在于,标准并没有规定B选项和D选项的行为到底是什么。

只是,大部分编译器,会优化两个字符串指针指向同一个地址,并且不允许对字符串常量进行修改,存在某个编译器使得答案完全相反的情况。

但是我们可以这样理解,如果B错误,则推出D也错误。所以只能选D。
发表于 2017-12-31 16:13:07 回复(0)
B选项正确么?指向字符串常量的指针不应该一样吗?
发表于 2017-07-07 21:20:17 回复(1)
求解释C选项。。。???


发表于 2017-08-18 16:24:10 回复(6)

关于字符串指针不可修改的问题

C/C++ code

char*m =" hello "; *(m+1) =' s '; for(;*m !=' \0 ';m++){ printf(" %c\n ",*m); }

但是出运行时错误。
----------------------------------------------------------
我用数组下标的方式是可以修改的:

C/C++ code
int i =0; char w[] =" hello "; w[1] =' s '; while(w[i] !=' \0 '){ printf(" %c\n ",w[i]); i++; }
 
答复一:
char *m = "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
疑问:
这种说法是错误的。如下:
 static int a = 10;
 int *b = &a;
 *b = 20;
 cout<<a<<endl;
输出结果为20.我们依然通过指针修改了存储在静态存储区里的数据源。
 
//---------------------------------------------------
答复二:
 
字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!
 
 
回复三:
char *m = "hello";
"hello"保存在文字常量区,该数据不能修改,默认有只读属性.
由指针m指向. 不能通过指针m来修改此值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
编辑于 2017-05-26 11:25:18 回复(0)
答案是D
         szX指向的内容是常量,不能被修改
发表于 2016-12-14 03:56:08 回复(0)

D选项的说明:

图片说明

发表于 2021-11-01 17:38:14 回复(0)
字符串常量 数据不可改
发表于 2019-10-05 15:52:38 回复(0)
我认为,D选项的错误的点不在于“abc”这个常量不能通过指针修改。
这里需要明确的是,szX和szY是两个指针变量,这两个变量存放的内容是常量或者变量的地址。

szX和szY这两个指针变量所指向的是同一个常量字符串“abc”,所以szX和szY这两个变量存放的是“abc”这个常量的地址值,
我认为“szX和szY的内容”正确的解读是指szX和szY所存放的值(即“abc”这个常量的地址值)。

确实,一个指针变量指向一个常量字符串之后,是不能通过这个指针变量来修改这个常量的,
但是,指针变量自身的值是可以被更改的。(只要是变量,值就可以被更改)


发表于 2019-08-20 19:04:26 回复(0)
指针与指针常量
发表于 2019-02-23 19:05:10 回复(0)
所以重点是不能修改 而不是修改后改不改变内容的问题
发表于 2019-01-28 20:47:10 回复(0)
char *szX = “abc”;与char *szY = ”abc”; ”abc”是保存在文字常量区,属于字符串常量,所以该数据不能修改,默认是只读属性。 因此不能通过指针szX或szY的指向来修改此值,而且szX和szY指向字符串常量”abc”相同的地址,可推出选D而不选B。 char acX[] = ”abc”; ”abc”是保存在栈空间数组里. 其数组名为acX,,数组名为数组的首地址(属于指针常量), 因此可以通过 acX[i] = 'x' 或 *(acX+i) = 'x' 的形式来修改数组内容。
编辑于 2018-05-22 11:39:19 回复(0)
B是对的,看评论。
编辑于 2018-02-28 22:19:50 回复(2)
B运行出来地址是不一样的啊?
发表于 2017-07-03 12:32:37 回复(0)
一开始看到C选项,就直接选了,脑袋发热了...
如果比较     char x[]="abc";
                   char y[]={'a','b','c'}
            
                   strlen(x) 和 strlen(y)之间的大小,那么数组x的长度是小于等于数组y的长度(x是3,strlen(3)是要遇到第一个‘\0’,这是一个未知值,所以x的长度是小于或等于y的长度),而数组x所占的内存空间是4(包括'\0'),y所占的内存空间只有3。 


发表于 2017-06-29 10:46:31 回复(0)
B选项什么鬼啊,运行了一下地址完全不一样啊
发表于 2017-06-10 23:38:16 回复(0)
D。char* szx = "abc"; 指向的是字面值常量,是不可修改的
发表于 2017-02-22 11:25:33 回复(0)