Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么修改通过调用dirname()返回的字符串文本不会引发segfault?_C_String_String Literals - Fatal编程技术网

C 为什么修改通过调用dirname()返回的字符串文本不会引发segfault?

C 为什么修改通过调用dirname()返回的字符串文本不会引发segfault?,c,string,string-literals,C,String,String Literals,我想知道为什么下面的代码在修改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()的结果字符串文字时不抛出分段错误,而在修改在常用文本中创建的字符串文字时抛出分段错误:

#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);

}
#包括
#包括
#包括
#定义文件路径“/usr/bin/screen”
内部主(空)
{
char db_file[]=文件路径;
char*filename=dirname(db_文件);
/*这里没有断层*/
文件名[1]=“a”;
/*这里的断层*/
char*p=“abc”;
p[1]=‘z’;
出口(0);
}
我知道这是一个UB来修改字符串文字,所以我得到的输出可能是完全有效的,但我想知道这是否可以解释。编译器对函数返回的字符串文本是否有不同的处理方式?当我在x86上使用Clang3.0编译这段代码,在x86和ARM上使用gcc编译这段代码时,也会出现同样的情况

这些函数可以返回指向静态分配内存的指针,这些指针可能会被后续调用覆盖。或者,它们可以返回指向路径某一部分的指针,这样,在不再需要函数返回的指针之前,不应该修改或释放path引用的字符串


因此,它可能会返回您可以修改的内存,也可能不会。我想这取决于您的系统。

来自

这些函数可以返回指向静态分配内存的指针,这些指针可能会被后续调用覆盖。或者,它们可以返回指向路径某一部分的指针,这样,在不再需要函数返回的指针之前,不应该修改或释放path引用的字符串


因此,它可能会返回您可以修改的内存,也可能不会。我想这取决于您的系统。

编译期间,字符串文本存储在只读内存段中,并在运行时加载

这个问题很好地解释了问题:


编译期间,字符串文本存储在只读内存段中,并在运行时加载

这个问题很好地解释了问题:

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

但是,如果OP的代码将“string”-literal传递给
dirname()
,这将是非法的,因为POSIX规范明确声明该函数可能修改传入的数组

从:

函数的作用是:修改path指向的字符串

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

但是,如果OP的代码将“string”-literal传递给
dirname()
,这将是非法的,因为POSIX规范明确声明该函数可能修改传入的数组

从:

函数的作用是:修改path指向的字符串


db_文件
不是字符串文字;这是一个初始化的数组。您在哪里读到
filename
指向字符串文字?
db\u file
不是字符串文字;这是一个初始化的数组。您在哪里读到
filename
指向字符串文字?是否引用UB:返回指针引用的数据“可能”会随时修改。这是否有意义是另一个问题。啊,我认为乔P的回答和乔纳瑟·莱弗勒的评论是这里的真正原因。由于OP在不分段故障时使用数组进行访问,这是有道理的。”因此,它可能返回您可以修改的内存,并且可能不是“可能不是”位不正确-静态分配内存意味着跨调用共享内存。这并不意味着只读内存。“可能返回指针…”部分让我将“可能不”位放在其中,我很好奇是否有一个注释在某个地方说,什么时候可能不是这种情况:返回指针引用的数据“可能”随时会被修改。这是否有意义是另一个问题。啊,我认为乔P的回答和乔纳瑟·莱弗勒的评论是这里的真正原因。由于OP在不分段故障时使用数组进行访问,这是有道理的。”因此,它可能返回您可以修改的内存,并且可能不是“可能不是”位不正确-静态分配内存意味着跨调用共享内存。这并不意味着只读内存。“可能返回指针…”部分是我将“可能不”位放在其中的原因,我很好奇是否有一个注释在某个地方说什么时候可能不是这样