被指针弄晕了,望帮忙拔云见日(二级指针,字符数组,字符串,强制转换(just for key words of seeking)

来源:百度知道 编辑:UC知道 时间:2024/04/27 22:13:18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char **p2 = (char **) malloc(10*sizeof(char *));

memset(p2,0x00,(10*sizeof(char *)));//为什么以*p2作为第一个参数不行
memset(p2,'a',(10*sizeof(char)));

printf("%c\n",*p2); /* 输出1个a */
printf("\n");
//printf("%s\n",*p2); /* 段错误,*p2不是字符串首地址吗*/
printf("%s\n",(char *) p2); /* 输出10个a ,为什么要强制转换 */

char *p1="aaaaaaaaaa";
*p2 = p1;
printf("%s\n",*p2); /* 输出10个a,这里又不要强制转换 */

return 0;
}

请详解,直至小白们都能看懂
胡乱忽悠的,一边玩去

不差分
请详解,直至小白们都能看懂
最好有示意图之类的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char **p2 = (char **) malloc(10*sizeof(char *));

//分配之后是这样的
/*
p2-> p2[0]==没有分配(所以指向的是非法的地方,是多少不确定,有时候是0xcccccccc)
p2[1]==没有分配(所以指向的是非法的地方)
p2[2]==没有分配(所以指向的是非法的地方)
p2[3]==没有分配(所以指向的是非法的地方)
......
p2[9]==没有分配(所以指向的是非法的地方)
*/

memset(p2,0x00,(10*sizeof(char *)));//为什么以*p2作为第一个参数不行
//你讲的*p2也就是p2[0],而p2[0]现在是指向非法地址的,若以*p2作为参数,那就是要清0他指向的内存,上面讲到他指向的是非法地址,当然会出错
/*
清0后是这样的,这样是为了不成为悬挂指针
p2-> p2[0]==0x00000000
p2[1]==0x00000000
p2[2]==0x00000000
p2[3]==0x00000000
......
p2[9]==0x00000000
*/

memset(p2,'a',(10*sizeof(char)));
// 又置为'a',十六进制是61,
/*
p2-> p2[0]==0x61616161(p[0]是指针型,32位系统下占4字节,他的4个字节都是'a',所以就是0x61616161)
p2[1]==0x61616161
p2[2]==0x61610000(只有10