我对C语言中字符串指针的一个误解

在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”这条语句在执行时做了三件事。

  1. 在内存中创建了一个常量空间,用于存放字符串
  2. 在字符串末尾添加了一个/0
  3. 返回字符串在内存中存放位置的首地址给p指针

所以,p指针中所保存的内容已经由字符数组a的首地址变为了字符串”Turbo C”的首地址,想当然的,字符串”Turbo C”也并未被赋值给字符数组a,而是存在于新的内存空间中。
此时我再用printf输出字符数组a的内容就会打印出一些乱七八糟的东西啦——因为我没有给数组a初始化,只有天才晓得编译器在里面填了什么东东~

那么上面那道程序这样改一下就正常工作啦:
将第7行改为

printf("%s\n", p);

Leave a Reply

Your email address will not be published. Required fields are marked *

Captcha Code