C语言:指针数组不需要分配内存?

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

int main(void)
{
char *pstr[10];
scanf("%s", pstr);
printf("The string input is %s",pstr);
}
在这个指针定义中,并没有分配内存,但是运行正常;
要是不是字符数组,而是
char *pc;
scanf("%c",pc);
printf("The char input is %c",*pc);
则系统会报错,为什么?

char * pstr[10];//代表有一个指针数组,有10个字符(串)指针元素;

scanf("%s",pstr);//代表给pstr[0]赋值,这个值仍然是一个整型地址,

printf("The string input is %s",pstr);//输出的只是pstr[0]指针指向的地址,并不是pstr[0]指针指向地址的内容.

//帖图给你看看(我给pStr[0]赋值1234,将转换成一个地址0x34333231,但它仍然是个错误的指针)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-06
char *pstr[10]; //这个会给pstr分配 40个字节的连续空间用来保存10个char*

而scanf和printf中的对pstr的解释取决于格式符
scanf("%s", pstr); //%s格式符会把psrt看作char*,于是把上面分配的内存当作char[40]使用了

printf("The string input is %s", pstr); //同样的这句把pstr当作char*了

char *pstr[10]; //pstr是个数组,不是指针,它占用40字节的空间,它有10个元素,每个元素都是指针,这些指针没有初始化追问

为什么是40个字节,char不是一个字节吗?那psrt[10]不是10个字节?

追答

pstr数组里保存的不是char ,而是char*, 40个字节保存10个指针, 这10个指针指向的地址里保存的数据才是char,在32位系统下,指针的长度都是4个字节

而scanf("%s", pstr); 会把pstr当作保存char的数组char[]来看待而不是char*[],
这个操作相当于:
char* p=(char*)pstr; //强制转换为char*
scanf("%s",p);

本回答被提问者和网友采纳
第2个回答  2015-05-25
指针数组是需要分配内存单元的。

指针数组表示一个指针类型的数组,数组中每个元素都是一个指针,而C语言中指针只占4个字节,所以指针数组所占的内存大小为4*N(N为数组的大小)。

举例如下:
int *a[5]; // 定义一个int类型的指针数组,共5个元素,每个元素都是一个int类型的指针,共占用4*5=20个字节的内存单元,这是在程序编译的时候进行内存分配的。
第3个回答  2014-01-06
char *pstr[10]中的pstr是一个数组,单独使用pstr时有指针的效果指向数组的内存。
char *pstr是一个未初始化的指针变量。使用pstr时指向的未分配内存。
第4个回答  2014-01-06
%s会赋给pstr字符串的地址,
而%c则对pc进行赋值(非地址值),显然错误。
相似回答