最近复习了下c语言,以前学习它只是为了应付考试,现在重新学习下,写写文章只是想着,哪天年龄大了,忘记了,再回头来翻看一下,如果其中有什么不对的地方,也请劳烦指正哈。
#include <stdio.h>
#include <string.h>
int main(){
char * buf = "123";
char * buf1 = "123";
char buf2[] = "123";
char buf3[] = "abc";
char buf4[10];
char * buf5 = strcpy(buf4,buf3);
char *str1 = (char*) malloc(4 * sizeof(char));
str1[0] = 'a';
str1[1] = '\0';
printf("buf的地址:%p\n",buf);
printf("buf1的地址:%p\n",buf1);
printf("buf2的地址:%p\n",buf2);
printf("buf3的地址:%p\n",buf3);
printf("buf4的地址:%p\n",buf4);
printf("buf5的地址:%p\n",buf5);
printf("str1的值:%s\n",str1);
printf("size of buf1: %d\n", sizeof(buf1));
printf("size of buf2: %d\n", sizeof(buf2));
printf("buf1长度为:%d ,buf2长度为:%d\n", strlen(buf1), strlen(buf2));
buf2[0] = 'a';
printf("buf2的值:%s\n",buf2);
printf("buf2的地址:%p\n",buf2);
free(str1);
str1 = NULL;
return 0;
}
执行结果如下:
结论1️:char * buf = "123";//buf指针创建于栈区,它指向的“123”位于字符串常量区;char * buf1 ="123";//buf1指针创建于栈区,它指向的“123”位于字符串常量区;由上面的地址打印可以知道buf和buf1都指向同一块地址,正是指向常量区的原因buf[0]= 'a';这样的操作会报错,常量区内容不可修改。
结论2:char buf2[] ="123";//buf2变量创建于栈区,“123“同样存储于栈区,所以我们执行 buf2[0] ='a';后再次打印buf2的值将变为”a23“,而buf2的地址没变。buf2指向数组的第零个元素,不可修改其指向,例如buf2++是会报错的。
结论3:char buf4[10];buf4变量创建于栈区,其分配的空间也在栈区,char * buf5 = strcpy(buf4,buf3);//新生成的指针变量buf5指向buf4,buf4在执行strcpy前要有足够的空间来存放buf3;
注意4:通过malloc创建数组分配在堆区,而指向它的指针变量创建于栈区。
注意5:sizeof(buf1)是计算的buf1这个指针的占用空间大小,指针大小在32位电脑上上占4个字节,在64位上占8个字节;sizeof(buf2)占四个字节是因为数组buf2”123”(末尾'\0')一共四个字符共占四个字节。strlen函数是计算截止到‘\0’时字符的个数(不包含'\0')。
网友评论