了解strlen函数-将const char * s分配给const char * sc

时间:2019-01-16 00:17:19

标签: c pointers memory c-strings

下面是“标准C库”中strlen.c的实现,

size_t strlen(const char *s){
   const char *sc;
   for(sc = s; *sc != '\0'; ++sc)

   return (sc-s);  }

我对sc = s合法性的理解正确吗?

sc=s是合法的赋值,因为由于两个变量都声明为const,所以两个变量都保护s指向的对象。在这种情况下,更改sc或s都指向的位置是合法的,但是对*ssc的任何赋值(或引用?)都是非法的。

3 个答案:

答案 0 :(得分:5)

我认为您要问的是 const 关键字的含义。如果没有,请澄清您的问题。

我想的方式是任何const变量都可以存储在ROM(只读存储器)中,未声明const的变量可以存储在RAM(随机存取存储器)中。这种类型取决于您使用的计算机的类型,因此const数据实际上可能不会存储在ROM中,但是可能会存储在ROM中。

因此,您可以对指针本身做任何想做的事,但不能更改其指向的内存中的数据。

这意味着您可以引用指针,并根据需要传递该指针。另外,您可以为指针分配一个不同的值。

说你有这个代码

const char* foo = "hello";
const char* bar = "world";

这样做完全合法

foo = bar;

现在两个都指向“世界”

这样做也是合法的

const char *myPtr = bar;
myPtr = foo;

您不允许执行的操作是更改实际的数据存储器,以便您不可以执行操作

foo[0] = 'J';

答案 1 :(得分:2)

您是正确的。

const char * sc声明一个指向const char的指针。从本质上讲,这意味着sc指向类型为char的变量(或者在这种情况下为char的连续数组) ,并且您不能使用{{1修改指向的变量。实时观看here

请注意,sc本身不是一个sc变量。 const适用于指向的变量,而不适用于指针。因此,您可以更改指针的值 ,即指针所指向的变量。

遵循此答案可以更深入地了解const和指针的不同用法:What is the difference between const int*, const int * const, and int const *?

答案 2 :(得分:2)

  

我对sc = s合法性的理解正确吗?

是的,只需要最后一部分的一些细节。

  

...但是对*ssc的任何赋值(或引用?)都是非法的。

(我怀疑OP的意思是“ ...或*sc将是非法的。”)

引用ssc指向的内容就像在char ch = *sc;中一样

尝试更改 *s*sc的值是未定义行为(UB),而不是{{1 }}
(请参见good additional detail by @rici

对于UB,分配可能有效,它可能在星期二不起作用,代码可能会崩溃,等等。C并未定义发生什么情况。确定性代码不应尝试这样做。