相关疑难解决方法(0)

为什么C中的复合文字可以修改

人们通常将"不可修改的"与术语"文字"联系起来

char* str = "Hello World!";
*str = 'B';  // Bus Error!
Run Code Online (Sandbox Code Playgroud)

然而,当使用复合文字时,我很快发现它们是完全可修改的(并且锁定在生成的机器代码上,你会看到它们被推到堆栈上):

char* str = (char[]){"Hello World"};
*str = 'B';  // A-Okay!
Run Code Online (Sandbox Code Playgroud)

我正在编译clang-703.0.29.这两个例子不应该生成完全相同的机器代码吗?如果它是可修改的,复合文字真的是文字吗?

编辑:一个更短的例子是:

"Hello World"[0] = 'B';  // Bus Error!
(char[]){"Hello World"}[0] = 'B';  // Okay!
Run Code Online (Sandbox Code Playgroud)

c c99 literals compound-literals lvalue

10
推荐指数
1
解决办法
1226
查看次数

结构vs字符串文字?只读与读写?

C99标准是否允许写复合文字(结构)?它似乎不提供写文字字符串.我问这个是因为它在C编程:现代方法,第 406页第2版​​中说.

问:允许指向复合文字的指针似乎可以修改文字.是这样的吗?

答:是的.复合文字是可以修改的左值.

但是,我不知道它是如何工作的,以及如何使用你当然无法修改的字符串文字.

char *foo = "foo bar";
struct bar { char *a; int g; };
struct bar *baz = &(struct bar){.a = "foo bar", .g = 5};

int main () {
  // Segfaults
  // (baz->a)[0] = 'X';
  // printf( "%s", baz->a );

  // Segfaults
  // foo[0] = 'a';
  // printf("%s", foo);

  baz->g = 9;
  printf("%d", baz->g);

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

您可以在我的列表中看到段错误,写入会baz->a导致段错误.但是,写作baz->g没有.为什么其中一个会导致段错而不是另一个?struct-literals与字符串文字有何不同?为什么struct-literals也不会被放入内存的只读部分,并且这两个行为是否定义或未定义(标准问题)?

c c99 compound-literals string-literals

8
推荐指数
1
解决办法
231
查看次数

c - *(void**)&(int [2]){0,PAGE_SIZE}; 含义?

上下文

阅读一些内核代码.

问题

我无法理解这条线的含义

*(void **) &(int[2]){0,PAGE_SIZE};
Run Code Online (Sandbox Code Playgroud)

更重要的是,这意味着什么

{0,PAGE_SIZE}
Run Code Online (Sandbox Code Playgroud)

对我而言,它看起来不像是逗号的函数.

这段代码可能会发生什么?我不明白这里的间接性.

它是函数还是演员?支架部分是什么意思?似乎对我如此复杂,但绝对有意义.

c pointers

7
推荐指数
1
解决办法
467
查看次数