您可以通过左右滑屏查看更多笔记内容。。
如果pa是一个地址,那么*pa 就是取出这个地址对应的值;
cd .. 返回上一级
cd ~ 返回默认[根目录]
cd ../.. 返回上级的上级
//一次性打印3个值,从0x7fffffffdea4开始,打印类型为d整形;
(gdb) x/3d 0x7fffffffdea4
0x7fffffffdea4: 3 0 2
#include <stdio.h>
int main(){
int a=3;
int b=2;
int array[3];
array[0]=1;
array[1]=10;
array[2]=100;
int *p=&a;
p+=3;//p[3]表示将内存地址往下移动3格,*p+=3 结果就是6,值+3,即在a的内存地址上
*p=101;//p[3]=101
p=&a;
int i;
for(i=0;i<6;i++){
printf("*p=%d\n",*p);
p++;
}
printf("------------------------------------------------");
p=&a;
for(i=0;i<6;i++){
printf("*p=%d\n",p[i]);
}
结果为何不一一致:
gdb调试是一次单独的运行,和正常编译后运行是不冲突的;
为什么还会有重复的
因为在分配内存是随机,对应的数值也是随机的;
数组:本质是一个指针常量;
指针,是一个指针变量;
#include <stdio.h>
int main(){
char str[]="hello";
char *str2="world";
char str3[10];
printf("input the value \n");
//当下边的值取str或者str3时,不需要写&,因为本身这两个就是数组,而数组的本质就是一个内存地址,所以可以进行直接可以进行赋值;
//scanf("%s",str3/str);
//当下边的内容取值为str2时,因为str2是一个地址,存放的是“word”的内存地址,属于代码段,是不允许更改的(是编译后,在程序运行就已经加载好的)。堆和栈可以更改。
scanf("%s",str2);
printf("str is %s\n",str);
printf("str2 is %s\n",str2);
printf("str3 is %s\n",str3);
}
‘\0’是判定字符数组结束的标识,表示这串字符到结尾了;或'\0'是字符串的结束符,任何字符串之后都会自动加上'\0'。
注意:在字符数组中’\0’是占一个位置的。
#include <stdio.h>
int main(){
char str[]="hello";
char *str2="world";
char str3[10];
printf("input the value \n");
scanf("%s",str);
//str[3]='\0';
printf("str is %s\n",str);
printf("str2 is %s\n",str2);
printf("str3 is %s\n",str3);
}
此时并没有给str3进行赋值,但结果
input the value
aaaaaaaaaaaaaaaaa
str is aaaaaaaaaaaaaaaaa
str2 is world
str3 is aaaaaaaaaaa//str3中
*** stack smashing detected ***: <unknown> terminated
已放弃 (核心已转储)
使用gdb 调试测试: