说,我们正在执行以下操作:
char* pc1;
char* pc2;
然后我们可以做
pc1 = "STRING";
pc2 = "ANOTHERSTRING";
我的问题是,如果pc1
仅在内存中pc2
的2个字节之前发生碰撞,该怎么办?当我们不知道它们不会发生冲突/重叠时,为什么可以将字符串文字设置为具有无限长度的指针?
编辑:我想问的只是在内存中pc1
之前pc2
的16个字节,同时指向一个300字节长的字符串。但是指针实际上指向内存中其他位置的字符串,因此感谢大家,我的问题现在很清楚。我没有选择pc1
故意是pc2
的后缀,但是,这似乎是另一个故事。
答案 0 :(得分:1)
我认为您可能对pc1
和pc2
的分配感到困惑。这些语句不是将引用的字符串的内容复制到pc1
和pc2
所指向的存储位置。它们正在更改 pc1
和pc2
指向的存储位置。要了解我的意思,让我们向您的代码中添加更多内容,并使其成为一个完整的程序:
#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
pc1
和pc2
首先指向“无”(NULL
或nil
)。然后,在赋值语句之后,我们将它们指向内存中分别包含字符串“ 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
每个都是一个不同的数组,并且文字只是它们的初始值。