更改数组的基地址
Posted
技术标签:
【中文标题】更改数组的基地址【英文标题】:Changing the array's base-address 【发布时间】:2019-06-17 12:19:40 【问题描述】:为什么我不能修改数组的基地址?是因为分配的内存会丢失吗?那样的话,我可以用一个指针做一个数组,改变指针指向的内容,分配的内存也会丢失,那有什么区别呢?
【问题讨论】:
代码已经编译,假设你不能改变基地址(因为你不能);它不会假设你用指向你自己分配的指针做了什么愚蠢的事情。 请edit您的问题并告诉一些背景信息您想要实现什么。 “修改数组的基地址”是什么意思?如果分配内存,则基地址在分配的内存块中。当您尝试访问指针指向的数据时,更改指向数组外部地址的指针将导致未定义的行为。 为什么需要更改数组的地址? 仅供参考,数组不是指针。 你会怎么做呢?没有可能的语法来改变 any 对象、数组的地址。 【参考方案1】:数组本身就是对象,而不是指针。考虑一个更简单的对象:
int a = 0;
您希望能够更改其地址吗?当然不是。对象是具有类型的存储区域。存储区域由其地址标识,因此您不会期望更改它。数组也是对象。当你声明
int b[8] = 0;
您声明一个对象,大小为 8 个整数,它将占用一些存储空间。你不能改变它的地址,就像你不能改变任何一个 int 的地址一样。
您可能被告知数组是指针。但他们不是!它们可能会更频繁地甚至隐式地转换为指针,但它们仍然是对象类型。指针通常代表数组,因为第一个元素的地址足以通过指针算术到达任何其他元素,但指针不是数组对象本身。当您检查它们的对象属性时,差异会变得很明显。例如:
sizeof(b) != sizeof(int*)
对象b
不是指针的大小,实际上是8个整数的大小,可能比指针还大。
【讨论】:
此外,C 中没有语法可以更改 any 对象的地址。这并不是说你可以改变其中一些人的地址,而不能改变其他人的地址。 @NikosC.:语法和语法允许更改任何对象的地址;&b = foo;
会这样做。语义禁止这样做,特别是 C 2018 6.5.16 2 中的约束:“赋值运算符应具有可修改的左值作为其左操作数。”
@StoryTeller:非常感谢,但是当我们将函数中的参数定义为数组(int arr[])时,我还有最后一个问题,我们可以将其视为那里的指针吗?我知道当我们将数组传递给函数时,地址会被传递,但我的意思是那个参数的大小不会是数组的大小,我们可以在函数内部将任何其他数组分配给这个参数。
@ASF - 您不能定义一个函数来获取一个数组。在声明 ` (int arr[])` 时,编译器已经将其调整为指针 (int *arr)
。该函数只能接受一个指针。正如我之前提到的,将数组作为参数传递是发生隐式转换的地方之一。【参考方案2】:
所有变量的地址都是在编译的不同阶段预先计算的。
在生成的代码中,您可以看到变量对象被替换为
Static+k for static linkage
Stack+k for automatic linkage
Reg regname
Constant hardcoded
也可以是其他类型的地址。
指针是一个对象,它的地址像上面一样被预先计算,但它的值可以是上面类型的变量。
【讨论】:
以上是关于更改数组的基地址的主要内容,如果未能解决你的问题,请参考以下文章
如何更改 Wordpress 电子邮件的回复标题中的电子邮件地址