字符串 字符串指针 常量

先看一段代码

#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <string.h>
#define A "9999"
int main(){
    char *str="888888";
    char string[10]="66666";
    printf("%p\n",A);                    //0x55555555600b
    printf("=================\n");  
    printf("%s\n",string);               //66666
    printf("%p\n",string);               //0x7fffffffe1ee
    printf("%p\n",&string);              //0x7fffffffe1ee
    printf("=================\n");
    printf("%s\n",str);                  //888888
    printf("%p\n",str);                  //0x555555556004
    printf("%p\n",&str);                 //0x7fffffffe1e0
}

通过上面这个例子,可以发现字符串数据(常量)都存储在常量区(或者只读区),局部变量存放在栈区。
同时可以看到打印string的两句他们的地址都是一样的,说明字符串数组就是一个简单的局部变量,不会存放到字符串常量区中去,所以string&string都是同一个地址。
然而,打印str的两句话发现他们地址不一样,而且间隔很远说明他们两是不同的区域,通过定义一个#define A可以看到字符串常量A所在的区域和字符串指针指向的是一块空间(相邻)。说明在C语言中, 字符串指针首先是在字符串常量中开辟一块空间来存储在该字符串,然后再在栈内存中开辟一个字符串指针指向常量区中的该字符串地址。
常量 都存储在常量区(或者只读区)
局部变量 都存储在栈区
全局变量 和 静态变量 存放在静态数据区

还有一个面试题
也是很简单的的,但是当时自己这里掌握不好,记一下
题目如下图,问题是运行该程序有什么问题
面试题
总的来说就是指针传参,因为这里是准备传入一个一级指针给GetMemory中去,但是注意如果想修改一级指针指向的值,我们必须传入一级指针的地址,然后修改它的指向,所以上面的程序修改如下

void GetMemory(char **p){
    *p=(char*)malloc(100);
}
int main(){
    char *str=NULL;
    GetMemory(&str);
    strcpy(str,"hello world");
	printf("%s\n",str);
}
//这样才能正确传入str并且为str开辟空间