c语⾔给指针分配内存空间,c语⾔-指针-分配内存和赋值需要注
意的
每次使⽤指针都会遇到⼤⼤⼩⼩的问题,每次都要翻开资料琢磨错在哪,寻根究底还是对指针还是没有完全掌握。本⽂为了加深映像,避免以后犯类似的错误,特地做了⼀些实验。
1.字符串指针变量赋值
#include
int main(){
char *b="azzzxxxddd";
b="azzzxxxdddccccc";
printf("%s", b);
system("pause");
return 0;
}
结果:没有报错,b赋值成功,正常输出。
原因分析:这⾥为什么没有内存溢出呢,原因是初始化b指针的时候将b指向了字符串常量"azzzxxxddd"的⾸地址,再次赋值"azzzxxxdddccccc"时,⼜将b指向了字符串常量"azzzxxxddd"的⾸地址,⽆论字符串长度怎么增加都不会内存溢出,可见初始化b的时候并没有分配内存,只是做了指向动作。
2.字符串指针变量分配动态内存和赋值
2.1
#include
#include
int main(){
char *b=(char*) malloc(5*sizeof(char));
strcpy(b, "abcdefghids");
printf("%s", b);
system("pause");
return 0;
}
结果:没有报错,b赋值成功,正常输出。
原因分析:这⾥为什么没有内存溢出呢,原因是虽然b指针指向了⼀段拥有5字符内存空间,但是恰好顺序下来的空间没有填满,所以后⾯的字符能装下。现在把这个字符串扩充⾄5000字节赋值再次运⾏,结果内存溢出报错。
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函数赋值的区别。
sizeof 指针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字符会内存溢出报错。
总结 :指针变量初始化赋值或直接赋值不会分配内存空间,赋值也只是改变了指针的指向,经过mallo
c动态分配内存后指针会指向⼀段连续的未被使⽤的内存空间,如果此时再使⽤直接赋值,指针就会指向新赋值的字符串⾸地址⽽放弃指向原来的分配空间,如果是⽤strcpy函数,它会将第⼆个参数填⾄指针指向的新内存空间,这是需要注意的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论