读书人

新手又来向老师们了帮小弟我看看这个

发布时间: 2013-10-01 12:15:56 作者: rapoo

新手又来向老师们求助了,帮我看看这个小程序错在哪了
就是用指针数组输出一个数组,总是出现关于内存的错误,我也搞不清怎么回事

#include<stdio.h>
#define N 100
main()
{
int j,i=0;
char a[N];
char *p[N];
gets(a);
while((*p[i++]=a[i++])!='\0');
*p[i]='\0';
for(j=0;j<=i;j++)
printf("%c",*p[i]);
}
c
[解决办法]
搞错了:
引用:
while((*p[i++]=a[i++])!='\0');
1)所有p[i],都没有初始化是野指针。
2) 同一表达式出现两处 i++,而且用作下标。

你可以这样写
int (*p)[N]=&a;
gets(a);
while ((*p)[i++]!='\0')
{
printf("%c",(*p)[i]);
}


或者
int *p[N];

for(int i=0;i<N;i++)
p[i]=&a[i];
gets(a);
while(*(p[i]))printf("%c",*(p[i++]));
不过这种写法,实在没有什么意思;

[解决办法]
p[i]=&a[i++];
是使得p[i]指针指向a[i]
如果不进行此操作p[i]指向的是未知内存,你给那个内存赋值自然出错。
详细请重新温习c语言指针
[解决办法]
引用:
两次i++这个错误太低级了,也不知道我怎么想的。如果写成while((*p[i]=a[i++])!='\0')不也相当于每次对p赋值吗?为什么也不行呢?

指针使用之前必须指向可用空间,你先确定p[i]是否有一个可用的指向,如果没有*p[i]就是错的。指针本身只是一个地址,这个地址未指向前,一般都是指向一个不可用的空间,所以你不能直接用*p[i]之类的语句,当你明确指向了一块可用空间后,才能用*p来操作指针所指向的空间的值

打个比方,一个内存空间相当于一个房间,指针是一个门牌,你给这个空间赋值,就等于是往这个空间里塞东西。如果指针(门牌)找不到,那么就可以说找不到这个房间,既然没有这个房间,怎么往里面塞东西,所以要么*p=&c;让p指向c这个房间,要么直接p=(char *)malloc(sizeof(char))去建立一个房间。

读书人网 >C++

热点推荐