gpt4 book ai didi

我们可以使用暴力通过指向数组的指针更改数组的基地址吗?

转载 作者:太空狗 更新时间:2023-10-29 14:54:02 27 4
gpt4 key购买 nike

有人写了下面的 C 程序,问为什么 gcc 允许“改变数组的基址”。他知道代码很糟糕,但仍然想知道。我发现这个问题很有趣,因为 C 中数组和指针之间的关系是微妙的(注意数组上地址运算符的使用!“为什么会有人这样做?”),令人困惑,因此经常被误解。这个问题被删除了,但我想我再问一遍,有适当的背景,而且——正如我希望的那样——有一个适当的答案。这是原始编。

static char* abc = "kj";

void fn(char**s)
{
*s = abc;
}

int main()
{
char str[256];
fn(&str);
}

它使用 gcc 编译(带有警告)、链接和运行。这里发生了什么?我们能否通过获取数组的地址、将其转换为指向指针的指针(毕竟 C 中的所有数组几乎都是指针,不是吗)并分配给它来更改数组的基地址?

最佳答案

它行不通(即使在理论上),因为数组不是指针:


  • int arr[10]:

    • 使用的内存量是sizeof(int)*10 字节

    • arr&arr的值必须相同

    • arr 指向一个有效的内存地址,但不能设置为指向另一个内存地址


  • int* ptr = malloc(sizeof(int)*10):

    • 使用的内存量是 sizeof(int*) + sizeof(int)*10 字节

    • ptr&ptr 的值不一定相同(事实上,它们大部分不同)

    • ptr 可以设置为同时指向有效和无效的内存地址,次数不限

关于我们可以使用暴力通过指向数组的指针更改数组的基地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25663855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com