char数组与char指针的内存分配空间

“char *p = 0, *rp = 0, *tmp = "adgadasdfasfasdfas";
int len;
p = tmp;
len = strlen(p);
if (len > 10) {
printf("original lenth:[%d]\n", len);
strncpy(rp, p, 10);
len = 10;
} else {
rp = p;
}
printf("p=[%s] len=[%d]\n", rp, len);
为什么strncpy(rp, p, 10);此处出现core?

你执行这个操作的时候rp执行的内存是0,没有分配啊,当然无法使用这块内存。
你定义成 char rp[100];就不会有问题了。”

请问为什么使用char rp[100]就不用内存分配的问题了?难道说char数组自动分配空间?谢谢!
"我上面说错了,指针声明时如果不初始化,都是指向同一个内存:
0xCCCCCCCC(十六进制)
而这块内存在系统中是不可写的(就是不能为其赋值)"

这里指的指针初始化应该有两个方式:
1、使用malloc函数分配空间
2、使用t = tmp;让t指向tmp指向的空间
理解对么?

char rp[100]定义一个字符数量为100的数组,程序编译或运行时会分配100个字符空间
char *rp;定义一个指向字符的指针,程序编译或运行时,会分配一个指针的空间,在32机上,通常也就是4字节。
说自动分配也是可以说得过去的。
说到空间分配,也就是内存管理。
通常有两种状况,一种是静态分配,(此种方式是编译器与系统自动分配的)
如我们通常定义的int a;这也分为两个状况。
如果int a;定义成全局变量,那么a 会在系统为程序分配的空间中。
如果int a;定义在函数内,那么a就会在程序的堆栈中。
另一种是动态分配,也就是程序在运行时向系统申请内存操作。主要是为了更好更灵活的对内存进行管理。
你执行这个操作的时候rp执行的内存是0,没有分配啊,当然无法使用这块内存。
应该说是rp指向的内存是非法的
虽然rp=0,算是一种初始化操作,但是没有给rp赋是一个真正的可用地址值,那么就不能把rp当成指针,并访问其地址。
p = tmp;并不是说,p把tmp数组复制了一个副本,而只是p中的值成了了tmp的地址(p指向tmp)。你可以把p理解成只是tmp的一个别名,就像一个人有两个名字,但不管如何人却是只有一个的。

初始化一个可用的指针变量,唯一的方法就是给它赋上一个合法的内存地址,不管是内存申请函数返回的内存地址,还是已有的内存地址。我们最终总会是把一个合法的内存地址赋值给这个指针变量。
int *p,*k,v;
p=malloc(sizeof(int));
k=&v;
k=p;
这些只是形式上的不同而已,反正一个可用的指针指向的一定是一个合法地址。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-09
数组空间是静态分配的,(就是在编译前就已经有了空间)
而指针声明时不指向任何内存;也就不能对其所指内存赋值了;
你可以这样
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *p = 0, *rp = 0, *tmp = "adgadasdfasfasdfas";
rp=(char*)malloc(11*sizeof(char)); //动态分配内存
//末尾要存储字符结束标识符('\0')所以多分配一个字节;
//这样rp就指向了11个字节的连续内存,就能对其赋值了;
int len;
p = tmp;
len = strlen(p);
if (len > 10) {
printf("original lenth:[%d]\n", len);
strncpy(rp, p, 10);
len = 10;
rp[10]='\0'; //加上字符结束标识符;
} else {
rp = p;
}
printf("p=[%s] len=[%d]\n", rp, len);
free(rp); //释放rp所指内存空间
}
我上面说错了,指针声明时如果不初始化,都是指向同一个内存:
0xCCCCCCCC(十六进制)
而这块内存在系统中是不可写的(就是不能为其赋值)

对的,其实就是两种方式
1,动态分配内存
2,为指针变量赋值
第2个回答  2011-01-08
若定义为char rp[100],编译器会在栈上为数组变量rp分配100字节的内存;
如果定义为char * rp, 编译器会在栈上为指针变量分配sizeof(char*)大小的内存,通常为4字节;如果要使rp有效,rp指针必须指向有效的内存地址,这时,你可以为它另外在堆上分配内存,或者指向另外一个字符串本回答被提问者采纳
第3个回答  2011-01-08
声明数组时就会为这个数组里将存的数据分配内存,而声明指针只会分配一块内存,用以保存以后指向的内存的地址本回答被网友采纳
第4个回答  2011-01-11
数组本身编译系统就会给它分配内存。而指针仅仅是一个指向一块内存的地址变量。