如果字符串在内存中重叠怎么办?

时间:2018-11-17 17:38:31

标签: c string pointers memory

说,我们正在执行以下操作:

char* pc1;
char* pc2;

然后我们可以做

pc1 = "STRING";
pc2 = "ANOTHERSTRING";

我的问题是,如果pc1仅在内存中pc2的2个字节之前发生碰撞,该怎么办?当我们不知道它们不会发生冲突/重叠时,为什么可以将字符串文字设置为具有无限长度的指针?

编辑:我想问的只是在内存中pc1之前pc2的16个字节,同时指向一个300字节长的字符串。但是指针实际上指向内存中其他位置的字符串,因此感谢大家,我的问题现在很清楚。我没有选择pc1故意是pc2的后缀,但是,这似乎是另一个故事。

2 个答案:

答案 0 :(得分:1)

我认为您可能对pc1pc2的分配感到困惑。这些语句不是将引用的字符串的内容复制到pc1pc2所指向的存储位置。它们正在更改 pc1pc2指向的存储位置。要了解我的意思,让我们向您的代码中添加更多内容,并使其成为一个完整的程序:

#include <stdio.h>

int main() {
    char* pc1 = NULL;
    char* pc2 = NULL;

    printf("pc1 pointing to location in memory: %p\n", pc1);
    printf("pc2 pointing to location in memory: %p\n", pc2);

    pc1 = "STRING";
    pc2 = "ANOTHERSTRING";

    printf("pc1 pointing to location in memory: %p\n", pc1);
    printf("pc2 pointing to location in memory: %p\n", pc2);
}

现在编译并运行它。当我在计算机上这样做时,将得到以下输出:

pc1 pointing to location in memory: (nil)
pc2 pointing to location in memory: (nil)
pc1 pointing to location in memory: 0x5578b61a57b8
pc2 pointing to location in memory: 0x5578b61a57bf

pc1pc2首先指向“无”(NULLnil)。然后,在赋值语句之后,我们将它们指向内存中分别包含字符串“ STRING”和“ ANOTHERSTRING”的不同位置。

答案 1 :(得分:0)

extension MyBookingsViewController: UITableViewDelegate, UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 8 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "BookingHistoryTableViewCell", for: indexPath) as! BookingHistoryTableViewCell cell.selectionStyle = .none return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("selected row number : \(indexPath.row)") } func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let editAction = UIContextualAction(style: .normal, title: "Edit") { (action, view, handler) in print("tapped on Edit : \(indexPath.row)") } let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { (action, view, handler) in print("tapped on Delete : \(indexPath.row)") } editAction.backgroundColor = UIColor(displayP3Red: 183/255, green: 183/255, blue: 183/255, alpha: 0.9) editAction.image = #imageLiteral(resourceName: "icon_edit_white") deleteAction.backgroundColor = UIColor(displayP3Red: 251/255, green: 86/255, blue: 92/255, alpha: 0.9) deleteAction.image = #imageLiteral(resourceName: "icon_delete_white") let configuaration = UISwipeActionsConfiguration(actions: [deleteAction, editAction]) configuaration.performsFirstActionWithFullSwipe = true return configuaration } } pc1是指针。内存布局可以是这样的:

pc2

这表明字符串的内容可以重叠,但是指针仍然不同。

之所以允许这样做,是因为不允许您修改字符串文字。因此,您不必担心更改Address Contents 1000 ANOTHERSTRING\0 1020 1007 pc1 variable 1024 1000 pc2 variable 所指向的字符串的内容并影响pc1的值,反之亦然。

请注意,只有在使用指向字符串文字的指针时,才会发生这种情况。如果这样做,就不会有重叠:

pc2

每个都是一个不同的数组,并且文字只是它们的初始值。