【问题标题】:C Pointer to arrays [duplicate]C指向数组的指针[重复]
【发布时间】:2021-11-08 05:05:36
【问题描述】:

我正在学习 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# 中编译,但程序崩溃。 你能帮我弄清楚当我执行程序时堆栈中发生了什么吗?

【问题讨论】:

  • char *c2 = "hello" 是一个字符串文字。修改它会导致UB。

标签: arrays c pointers nspointerarray


【解决方案1】:
char c1[] ="hello";

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

char* c2 = "hello";

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

【讨论】:

  • 我有 1 个问题,如果我们有: c1[]="hello";和一个指针 c2 指向字符串 c1:char *c2=c1;这个语句可以:c2[0] = c2[1]; beetween 语句 c2[0] = c2[1] 有什么不同;我的意思是在 2 种情况下 c2 仍然是指向字符串的指针
  • 区别在于指向字符串的指针和指向字符串文字的指针。在char* c2 = c1 - c2 将指向c1 的内存,该内存分配在在堆栈上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2017-08-25
  • 2014-11-20
相关资源
最近更新 更多