功能代码如下:
void TrimRight(char* s)
{
if(!*s) return;
char* end = 0;
for(char c; c = *s; s++)
{
if(c == ' ') { if(end == 0) end = s; }
else end = 0;
}
if(end)
*end = '\0'; // segmentation fault when char* is char* and not through char[]
}
我知道有关堆栈、段等的东西...... 但即使这些东西的汇编代码也是相同的:
char* text = "I'm a text";
int main()
{
TrimRight(text);
return 0;
}
.LC0:
.string "I'm a text"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
mov rax, QWORD PTR [rbp-8]
mov rdi, rax
call TrimRight(char*)
mov eax, 0
leave
ret
和
char text[] = "I'm a text";
int main()
{
char* ptr = text;
TrimRight(ptr);
return 0;
}
text:
.string "I'm a text"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:text
mov rax, QWORD PTR [rbp-8]
mov rdi, rax
call TrimRight(char*)
mov eax, 0
leave
ret
我还是不明白转账有什么区别。 在此之前,我怀疑也许汇编器没有很好地解析已经传递的指针,就好像它是由第一个选项实现的一样。然而,这完全是无稽之谈!地址值不会去任何地方,而是作为参数传递。
那么如何解决呢?
好吧。字符串文字、只读内存都很好。但有没有可能通过这种方式获得访问权限?