每次使用指针都会遇到大大小小的问题,每次都要翻开资料琢磨错在哪,寻根究底仍是对指针仍是没有彻底掌握。本文为了加深映像,避免之后犯相似的错误,特意作了一些实验。数组
1.字符串指针变量赋值函数
#include<stdio.h>
int main(){
char *b="azzzxxxddd";
b="azzzxxxdddccccc";
printf("%s", b);
system("pause");
return 0;
}指针
结果:没有报错,b赋值成功,正常输出。内存
缘由分析:这里为何没有内存溢出呢,缘由是初始化b指针的时候将b指向了字符串常量"azzzxxxddd"的首地址,再次赋值"azzzxxxdddccccc"时,又将b指向了字符串常量"azzzxxxddd"的首地址,不管字符串长度怎么增长都不会内存溢出,可见初始化b的时候并无分配内存,只是作了指向动做。字符串
2.字符串指针变量分配动态内存和赋值string
2.1
io
#include<stdio.h>
#include<string.h>
int main(){
char *b=(char*) malloc(5*sizeof(char));
strcpy(b, "abcdefghids");
printf("%s", b);
system("pause");
return 0;
}变量
结果:没有报错,b赋值成功,正常输出。总结
缘由分析:这里为何没有内存溢出呢,缘由是虽然b指针指向了一段拥有5字符内存空间,可是刚好顺序下来的空间没有填满,因此后面的字符能装下。如今把这个字符串扩充至5000字节赋值再次运行,结果内存溢出报错。di
2.2
int main(){
char *a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *b=(char*) malloc(5*sizeof(char));
b = a;
printf("%s", b);
system("pause");
return 0;
}
结果:没有报错,b赋值成功,正常输出。
缘由分析:这里为何没有内存溢出呢,缘由是虽然b指针指向了一段拥有5字符内存空间,可是第二次赋值指针b指向了a指针所指向的地址,原来给b分配的内存空间没有使用。如今把a指向的字符串扩充至5000字节再次运行,依然没有报错,再次证实了这一点,也说明了直接赋值和使用strcpy函数赋值的区别。
2.3
int main(){
char a[20]="aaaaaaaaaaaaaaaaa";
char *b=(char*) malloc(5*sizeof(char));
b = &a;
printf("%s", b);
system("pause");
return 0;
}
结果:没有报错,b赋值成功,正常输出。
缘由分析:道理同2.2,只是把字符串常量放入了数组,再另b指向数组a的首元素地址。
2.4
int main(){
char a[20]="aaaaaaaaaaaaaaaaa";
char *b=(char*) malloc(5*sizeof(char));
strcpy(b, a);
printf("%s", b);
system("pause");
return 0;
}
结果:没有报错,b赋值成功,正常输出。
缘由分析:道理同2.1,把数组a改成5000容量,内放5000字符会内存溢出报错。
总结 :指针变量初始化赋值或直接赋值不会分配内存空间,赋值也只是改变了指针的指向,通过malloc动态分配内存后指针会指向一段连续的未被使用的内存空间,若是此时再使用直接赋值,指针就会指向新赋值的字符串首地址而放弃指向原来的分配空间,若是是用strcpy函数,它会将第二个参数填至指针指向的新内存空间,这是须要注意的。