在QQ群中看到一道C语言题:
定义char a[10]和char *p=a,下面的赋值语句中,正确的是___
A. a[10]=”Turbo C” B. p=”Turbo C”
C. a=”Turbo C” D. *p=”Turbo C”
这道题选B本身是没有任何值得疑惑的地方的,但是,且看我下面这个小程序。
#include<stdio.h> int main(void) { char a[10]; char *p = a; p = "Turbo C"; printf("%s\n", a); //这里我打印的是数组a而不是指针p return 0; }
在Linux下编译执行后输出乱码,这个错误是因为我一开始以为:p = “Turbo C”是将”Turbo C”这个字符串赋值给了p所指向的字符数组a。
实际上,p = “Turbo C”这条语句在执行时做了三件事。
- 在内存中创建了一个常量空间,用于存放字符串
- 在字符串末尾添加了一个
/0
- 返回字符串在内存中存放位置的首地址给p指针
所以,p指针中所保存的内容已经由字符数组a的首地址变为了字符串”Turbo C”的首地址,想当然的,字符串”Turbo C”也并未被赋值给字符数组a,而是存在于新的内存空间中。
此时我再用printf
输出字符数组a的内容就会打印出一些乱七八糟的东西啦——因为我没有给数组a初始化,只有天才晓得编译器在里面填了什么东东~
那么上面那道程序这样改一下就正常工作啦:
将第7行改为
printf("%s\n", p);