gpt4 book ai didi

c - 为什么修改调用 dirname() 返回的字符串文字不会引发段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:29 25 4
gpt4 key购买 nike

我想知道为什么以下代码在修改作为 dirname() 结果的字符串文字时不会抛出段错误,但在修改通常创建的字符串文字时会抛出段错误:

#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>

#define FILE_PATH "/usr/bin/screen"

int main(void)
{
char db_file[] = FILE_PATH;
char *filename = dirname(db_file);

/* no segfault here */
filename[1] = 'a';

/* segfault here */
char *p = "abc";
p[1] = 'z';
exit(0);

}

我知道修改字符串文字是一个 UB,因此我得到的输出可能完全有效,但我想知道是否可以解释这一点。函数返回的字符串文字是否被编译器区别对待?当我在 x86 上使用 Clang 3.0 并在 x86 和 ARM 上使用 gcc 编译此代码时,会发生同样的情况。

最佳答案

dirname()不返回对“字符串”文字的引用,因此修改返回指针引用的数据是完全合法的。这样做是否有意义是一个不同的问题,因为返回的指针可能引用传递给 dirname()char 数组。

但是,如果 OP 的代码将“字符串”字面量传递给 dirname(),则这已经是非法的,因为 POSIX 规范明确指出该函数可以修改数组传入。

来自POSIX specifications :

The dirname() function may modify the string pointed to by path.

关于c - 为什么修改调用 dirname() 返回的字符串文字不会引发段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24660410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com