内存地址如何知道数组的长度?

时间:2018-05-02 02:23:46

标签: c memory c-strings

我想我可以标记C ++,Assembly和C,因为内存管理在所有语言中的工作方式都相似。

我刚刚在C中登上我学习指针的地方。我知道如果你存储一个字符串(或者在C中,更好地称为char数组),它实际上只是该数组中第一个元素的内存地址。

数组的第一个元素如何知道整个数组需要计算多少,我自己的猜测是它在第一次出现\0时停止但是我是对的吗?我告诉\0表明阵列已经完成,你已经击中了最后一个元素(或者技术上,最后一个元素后面的1)。

我想我发布了这个用于验证我的正确答案。任何人都可以更详细地解释它吗?

4 个答案:

答案 0 :(得分:1)

没有。

使用太大的值作为索引,您可以读取/写入数组外部的内存。

在C ++中执行,优化器可以缓存数据而不刷新数据并获得疯狂的程序状态(UB)。

现在,通过 <Cookie action="update" name="{./@name}"> <Secure>1</Secure> <HTTPOnly>1</HTTPOnly> </Cookie> 复制结构中的数组?然后在编译时知道大小,同样没有使用运行时标记。

答案 1 :(得分:1)

在这些低级语言中,您甚至可以通过分配的内容访问数组。您必须手动跟踪阵列的持续时间。但是,可以构建不同的数据类型(如链接列表)以跟踪数据的开头和结尾。例如,在Python中,有“列表”而不是“数组”,列表的大小可以使用“len”内置函数找到。

答案 2 :(得分:1)

要回答你的问题,内存地址不会“#34;知道&#34;数组有多长。这一切都取决于您的计算机体系结构,并通过CPU指令发现。当您访问数组的第一个元素时,CPU会解码一条指令,并继续获取给定内存地址中的第一个数据字节。第一个数据字节应包含与特定char元素相关的ascii值,并显示所需的字符。如果遍历字符串并正确实现它,通常会有一个空字符,您可以结束迭代。但是,请注意不保证null字符存在。

答案 3 :(得分:1)

  

我明白如果你存储一个字符串(或者在C中,更好地称为   char array)它实际上只是第一个内存中的地址   那个数组的元素。

[narrow]字符串文字的类型为char[C],其中C == 1+strlen(s)(1代表最后的'\0'strlen函数从其返回值中排除)。

如果将字符串文字存储在char*类型的变量中,那么它确实如你所说:只是该数组第一个元素的内存中的地址。这就是&#34;阵列衰减&#34;的工作原理。

但是,如果您将字符串文字存储在char[N]类型的变量中,那么工作方式取决于N1+strlen(S)(其中S将是字符串字面量)。如果N < 1+strlen(S),则只有N个字符存储在char数组中,并且数组不会被'\0'终止。如果N >= 1+strlen(S),那么S的所有字符都存储在char数组中,并且对于数组,任何超过1+strlen(S)的元素都会按照惯例进行零初始化。

  

数组的第一个元素如何知道它需要计算多少   对于整个阵列,我自己的猜测是它在第一次出现时停止   \0,但我是对的?我告诉\0是阵列的标志   已经完成你已击中最后一个元素(或技术上,1后   最后一个元素)。

第一个元素不存储数组的计数,除非你这样做。在将字符串文字或任何其他char数组存储在char*类型的对象中的情况下,除非您手动将大小存储在第一个元素中,否则您将丢弃大小信息(字符串)用Pascal编程语言做这个)。无论您是否存储了尺寸,您仍然需要负责跟踪尺寸信息。如果使用字符串文字初始化类型为char[N]的对象,则保留数组的大小信息,编译器将跟踪数组生命周期内的所有N个字符。