c - C 中的字符串常量与 char 数组

标签 c arrays string char memory-model

<分区>

Possible Duplicate:
What is the difference between char s[] and char *s in C?

更多的是一般性问题,而不是试图解决问题,我一直在阅读 C 编程语言书籍,他们注意区分

char amessage[] = "blah";
char *pmessage = "blah";

区别在于一个是字符数组,另一个是指向字符串常量的指针。他们说修改 char 数组是可以接受的,但你不应该修改字符串常量,因为它会触发未定义的行为。我的问题是:字符串常量在内存中的存储方式与 char 数组不同吗?为什么我可以修改成

char *p = "this is a string constant";
*(p+2) = 'a';
printf("%s", p);

如您所料,最终打印“thas is a string constant”。我可以理解它是如何有意义的,因为字符串 constant 不应该在运行时最终被改变,因为它可能会使其他人/你自己在处理你的代码时感到困惑,而不是期望它的值(value)会改变,但纯粹是功能术语它有什么问题,可能触发的未定义行为是什么以及当 char 数组不会触发时它如何机械地适得其反?我只是想知道我是否遗漏了一些关于字符串常量在内存中的工作方式以及编译器如何看待它们的信息。

最佳答案

至少在我的电脑上,以下程序崩溃了:

#include <stdio.h>
int main() { 
  char *p = "this is a string constant";
  *(p+2) = 'a';
  printf("%s", p);
}

如果它看起来适合您(它可能适用于某些嵌入式编译器),那么您就走运了。未定义的行为意味着程序可以做任何事情。参见 http://blog.regehr.org/archives/213 .

另见 What is the difference between char s[] and char *s? .

关于c - C 中的字符串常量与 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5972915/

相关文章:

javascript - 如何显示数组中的随机项目?

java - 将字符串的字节复制到所选字符集中的所选数组

c - 串行端口 IAR 上的 Sprintf 和浮点值

c - 用 c 舍入

arrays - 在 swagger 中创建可重用的数组定义

php - 在 JSON 中添加其他对象

php - 替换字符串以匹配复数或单数

c++ - 如何使用Arduino Serial.println使用 float 打印字符串

混淆按位运算 |和<<

C 字符串修改