指针数组的应用

lanmansize 2007-12-27 02:55:12
先说下意图
用指针数组存放3个字符数组的地址,然后通过指针数组将3个字符数组的值打印出来
程序如下,打印不出正确的值来
****************************************************************************
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *a[3];
char b0[10];
char b2[10];
char b1[10];
int n;
strcpy(b0,"I LOVE YOU 0");
strcpy(b1,"I LOVE YOU 1");
strcpy(b2,"I LOVE YOU 2");
for(n=0;n<3;n++)
{
a[n]= (char*)malloc(100);
if(a[n]==NULL)
{
return -1;
}
memset(a[n],'/0',sizeof(a[n]));
}
a[0] = b0;
a[1] = b1;
a[2] = b2;
n=0;
for(n=0;n<3;n++)
{
printf("a[%d]=[%s]\n",n,a[n]);
printf("sizeof(a[%d])=%d\n",n,sizeof(a[n]));
}
getchar();
/*释放内存*/
aio(a);
return 0;
}
aio(char *a[])
{
int i;
for(i=0;i <4;i++)
free(a[i]);
}
...全文
583 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
szduweibing 2007-12-29
  • 打赏
  • 举报
回复
那么lz就是一定要分配空间,再来一次复制了?

#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *a[3];
char b0[20];
char b2[20];
char b1[20];
int n;

memset(b0,0,20);
memset(b1,0,20);
memset(b2,0,20);

strcpy(b0,"I LOVE YOU 0");
strcpy(b1,"I LOVE YOU 1");
strcpy(b2,"I LOVE YOU 2");

for(n=0;n<3;n++)
{
a[n]=(char *)malloc(100);
memset(a[n],0,100);
}

strcpy(a[0],b0);
strcpy(a[1],b1);
strcpy(a[2],b2);

for(n=0;n<3;n++)
{
printf("a[%d]=[%s]\n",n,a[n]);
printf("sizeof(a[%d])=%d\n",n,sizeof(a[n])); //这个语句没有多大用处,只是打印出存放指针的空间的大小,但是32位机,都是4
}
for(n=0;n<3;n++)
free(a[n]);

return 0;
}
lanmansize 2007-12-28
  • 打赏
  • 举报
回复
//按照lz的意图,用指针数组存放字符数组。
这句只是存放地址
如果数据值改变了,会出现覆盖现象
szduweibing 2007-12-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *a[3];
char b0[20];
char b2[20];
char b1[20];
int n;

memset(b0,0,20);
memset(b1,0,20);
memset(b2,0,20);

strcpy(b0,"I LOVE YOU 0");
strcpy(b1,"I LOVE YOU 1");
strcpy(b2,"I LOVE YOU 2");

a[0] = b0;
a[1] = b1;
a[2] = b2; //按照lz的意图,用指针数组存放字符数组。

for(n=0;n <3;n++)
{
printf("a[%d]=[%s]\n",n,a[n]);
printf("sizeof(a[%d])=%d\n",n,sizeof(a[n])); //这个语句没有多大用处,只是打印出存放指针的空间的大小,但是32位机,都是4
}

return 0;
}
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
szduweibing
能把修改后的程序发一下么
szduweibing 2007-12-27
  • 打赏
  • 举报
回复
错误1:
memset(a[n],'/0',sizeof(a[n]));
你的意图应该将整个指针清0。但是结果不是,sizeof(a[n])=4;
错误2:
a[0] = b0;
a[1] = b1;
a[2] = b2;
既然你给a分配了空间,那么你又为什么要改变指针指向的地方,这样你以后如何释放你分配的空间?

错误3:数组的大小也不够

错误4:释放内存,首先释放不了,其次只有3个,你却要释放4次
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
你这个句就是浅拷贝
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
a[0]=b0;注意深浅拷贝问题!!!!~~

这句我理解不透
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
单是你这个例子是一样的结果,但是数组和指针是有区别的。
a代表的是数组的首地址,你要是取一个数组的地址,其实也是首地址。
yuandyi 2007-12-27
  • 打赏
  • 举报
回复
#include   <stdio.h> 
#include <string.h>
#include <malloc.h>

void aio(char *a[])
{
int i;
for(i = 0 ;i < 3 ;i++)
free(a[i]);
}
int main()
{
char *a[3];
char b0[20];
char b2[20];
char b1[20];
int n;
strcpy(b0,"I LOVE YOU 0");
strcpy(b1,"I LOVE YOU 1");
strcpy(b2,"I LOVE YOU 2");
for(n=0;n <3;n++)
{
a[n]= (char*)malloc(100);
if(a[n]==NULL)
{
return -1;
}
memset(a[n],'/0',sizeof(a[n]));
}
strcpy(a[0], b0);
strcpy(a[1], b1);
strcpy(a[2], b2);
n=0;
for(n=0;n <3;n++)
{
printf("a[%d]=[%s]\n",n,a[n]);
printf("sizeof(a[%d])=%d\n",n,sizeof(a[n]));
}
getchar();
/*释放内存*/
aio(a);
return 0;
}

函数调用,要不在main之前声明,要不第一放前面,否则调用不到!!
a[0]=b0;注意深浅拷贝问题!!!!~~
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
前两天有人发个帖子,出了个题,把我整的晕晕的
int a[]
单说a代表地址吗
如果是
&a又是什么?
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
我看不出来了!
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
aio(char *a[])
{
int i;
for(i=0;i <3;i++) //这里改了没有呢?
free(a[i]);
}

这样呢?
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
aio(char *a[])
{
int i;
for(i=0;i <4;i++) //这里改了没有呢?
free(a[i]);
}
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
指针数组和变量用strcpy,我在TC下编译运行都没问题
放在unix下就报错
上面那些程序的内存申请和释放会不会出现问题呢
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
太大了啊,有点晕,出现覆盖现象


覆盖现象已好
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
我认为不是那句的原因,你先看看程序中其他的地方是不是有什么问题!
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
太大了啊,有点晕,出现覆盖现象
nkranber 2007-12-27
  • 打赏
  • 举报
回复
a[n]没必要malloc,直接
a[0] = b0;
a[1] = b1;
a[2] = b2;
shaoze5 2007-12-27
  • 打赏
  • 举报
回复
拿你的程序上来看一下啊。
lanmansize 2007-12-27
  • 打赏
  • 举报
回复
编译不过去,那个编译环境很是让我头痛

加载更多回复(11)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧