相关疑难解决方法(0)

字符串文字:指针与字符数组

在这个声明中:

char *a = "string1"
Run Code Online (Sandbox Code Playgroud)

究竟什么是字符串文字?是string1吗?因为这个线程C和C++中字符串文字的类型是什么?说些不同的东西.

据我所知

int main()
{
    char *a = "string1"; //is a string- literals allocated memory in read-only section.
    char b[] = "string2"; //is a array char where memory will be allocated in stack.

    a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults. 
    b[0] = 'Y'; //Valid. 

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

请添加除上述要点之外的一些细节.谢谢.

调试输出显示错误 a[0] = 'Y';

Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: …
Run Code Online (Sandbox Code Playgroud)

c segmentation-fault string-literals

9
推荐指数
1
解决办法
1万
查看次数

是否根据C89标准修改了字符串文字的未定义行为?

我相信在C99中,字符串文字的修改是未定义的行为.我没有该标准的副本,但我确实有一份C1X(n1570)草案,该草案在6.4.5第7段中说明:

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

我发现了一个涉及此主题的Stack Overflow 问题,其中包含Jonathan Leffler的以下评论:

最初,C89(C90)标准并没有禁止修改文字,因为在标准之前编写的代码太多会被它破坏.

但是,我也看到很多的讨论类型的字符串文字和事实,他们是char[N]const char[N].我认为这个决定是为了使大量现有代码不会破坏.

任何人都可以给我一个明确的答案.在C89中是字符串文字修改UB吗?

c

5
推荐指数
1
解决办法
877
查看次数

标签 统计

c ×2

segmentation-fault ×1

string-literals ×1