我发现在定义 char *d[0] 后给d[0]这个地址一个一字符的空间,然后把web这个字符串复制到d[0]这个地址所指的空间里,
那么显示printf("%s", d[0])就显示的是web
运行结果:web
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[0];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
第二种:直接给d[0]复值字符串"web"然后显示printf("%s", d[0])
运行结果:web
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[0];
d[0]="web";
printf("%s",d[0]);
return 0;
}
那么我的疑问就是d[0]=malloc(1*sizeof(char));有什么作用
怎么理解和使用
还有就是数组指针的用法和怎样复值
按照vipercn的说法,那么
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
d[1]=malloc(1*sizeof(char));
d[2]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[1]);
return 0;
}
应该显示的是eb
但是显示的是乱码
printf("%c",*d[1])显示的是h显然没有这个字,也属于乱码
不能定义*d[0],因为这个数组的大小为0!
可以这样来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此时*d[]为一个指向指针的指针
d[0]=malloc(1*sizeof(char));
此句话的意思是,分配1个字节的内存空间给d[0],也就意味着d这个数组的第一个元素[0]内保存的是一个1字节空间的地址,因为d[0]指向一个地址!
你可以这样理解
对于普通的数组(例如 char d[4];),在内存中是这样的
变量:内存地址:内容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此处 char *d[4]; *d[0] = malloc(1*sizeof(char));,是这样的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在内存0x400100h处
才保存着"web\0"
不好意思,我上面说错了,应该是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在内存0x400100h处
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
对应的,你的代码执行后,内存变量应该是这样的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在内存0x400100处:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:随机字符
......
0x400108h:随机字符
以上内存地址是以字节方式内存对齐的,用一些编译器编译后可能地址会有些问题(比如d[0]到d[1]不止差了4,可能是8),但总体框架就是这样!
在你的代码中有如下定义:
char *d[0]; //能这么定义?这样定义是不正确的
我想你要表达的意思是否是
d[0]=malloc(1*sizeof(char));
//申请1BYTE内存,用于存放USER使用。
strcpy(d[0],"web");
//将web字符串复制到以d[0]为首地址的连续的4 BYTEs地址空间中(在字符串末尾自动加/n,所以能得到正确的输出)?
printf("%s",d[0]);
以上是个人愚见……请指教!
针对问题补充:
1、首先,malloc函数的申请内存时,必须强制转换.
即:
d[0]=(char*)malloc(1*sizeof(char));
d[1]=(char*)malloc(1*sizeof(char));
d[2]=(char*)malloc(1*sizeof(char));
2、其次:
malloc函数是动态申请内存的,这样。d[0],d[1],d[2]并不是我们期望的连续地址。这样,你若输出d[1]内存中的数据。即会出现乱码!
但你如果输出printf("%s",d[0]);则得出正确结果“web”。也就应证了我上面的说法。本回答被网友采纳