0

我正在学习 C 中的指针。当我声明时:

char c1[] ="hello";
c1[0] = c1[1];
printf("%s\n", c1);

它打印出来eello

但是当我执行以下操作时:

char * c2="hello";
c2[0] = c2[1];
printf("%s\n", c2);

它在 C# 中编译,但程序崩溃。你能帮我弄清楚当我执行程序时堆栈中发生了什么吗?

4

1 回答 1

1
char c1[] ="hello";

在这行代码中,c1被声明为chars 的本地数组,其内容将被放入函数的堆栈中。函数堆栈是可修改的,因此c1[0] = ...可以工作。

char* c2 = "hello";

这里有一个细微的区别 -c2不是数组,而是指向字符串文字的指针。根据标准,修改它是未定义的行为 - 实际上,通常发生的情况是"hello"字符串被放置在可执行文件的只读.data部分中 - 尝试修改它会触发页面错误,导致程序崩溃。

于 2021-09-12T17:15:32.077 回答