#include <stdio.h> int main() { char str[] = "abcd"; printf("%p\n", "a"); printf("%p\n", "ab"); printf("%p\n", "abc"); printf("%p\n", "ab""c"); printf("%d\n", *("abc" + 3)); printf("%d\n", sizeof(str)); return 0; }
为什么呢?编译器会把字符串字面值替换成第一个字符存储区的地址,那“a”“ab”“abc”的地址不应该都是a的地址吗?而且它们的间隔还不一样?
解决方案
15
%p是输出地址,printf(“%p\n”, “a”);输出的是”a”这个常量字符串的地址
假如需要输出字符串的值,用%s
“a” “ab” “abc” 是不同的常量,内存地址不相同的
假如需要输出字符串的值,用%s
“a” “ab” “abc” 是不同的常量,内存地址不相同的
10
“a”“ab”“abc”是三个不同的常量字符串,分开存储。
30
C最早设计时定义了“常量”字符串,可以在编译时做优化节省空间.
常量字符串编译时会将相同的值合并到一起。
而”a”,”ab”,”abc”显然不是相同的值
常量字符串编译时会将相同的值合并到一起。
而”a”,”ab”,”abc”显然不是相同的值