- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人写了下面的 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/
用户将输入重量阈值、物体数量以及 3 个物体的重量和成本。输出应该是背包图,并且应该显示最优解。 重量应该最大,成本应该最小。 示例输出: w=60 n=3 w = 10 w2 = 35 w3 = 3
所以我在学习 Python 的同时从“Violent Python”开始黑客攻击,我遇到了一个问题这是我的代码: import optparse import socket from socket i
我是一名优秀的程序员,十分优秀!