我想我可以标记C ++,Assembly和C,因为内存管理在所有语言中的工作方式都相似。
我刚刚在C中登上我学习指针的地方。我知道如果你存储一个字符串(或者在C中,更好地称为char数组),它实际上只是该数组中第一个元素的内存地址。
数组的第一个元素如何知道整个数组需要计算多少,我自己的猜测是它在第一次出现\0
时停止但是我是对的吗?我告诉\0
表明阵列已经完成,你已经击中了最后一个元素(或者技术上,最后一个元素后面的1)。
我想我发布了这个用于验证我的正确答案。任何人都可以更详细地解释它吗?
答案 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]
类型的变量中,那么工作方式取决于N
和1+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
个字符。