在方程中传递 char* 而不是 char[] 时,函数中会出现分段错误。如何访问 char* 文字? (避免只读)

问题描述 投票:0回答:1

功能代码如下:

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

我还是不明白转账有什么区别。 在此之前,我怀疑也许汇编器没有很好地解析已经传递的指针,就好像它是由第一个选项实现的一样。然而,这完全是无稽之谈!地址值不会去任何地方,而是作为参数传递。

那么如何解决呢?


好吧。字符串文字、只读内存都很好。但有没有可能通过这种方式获得访问权限?

c c-strings undefined-behavior string-literals
1个回答
0
投票

C 2017,6.4.5 字符串文字 p7 说:

如果程序尝试修改这样的数组,则行为是未定义的。

gcc 说:

字符串常量可能存储在内存的只读区域中。

如果需要修改数组,请使用堆或局部变量。

© www.soinside.com 2019 - 2024. All rights reserved.