为什么数值丢失了?

itlcx 2006-03-24 11:31:20
下面是我碰到的问题,想了很久,不得其解:
int main(int argc, char* argv[])
{
char *n[5];
char Str[20];
int i;

for (i=0;i<5;i++)
{
sprintf(Str,"%d",i);
n[i]=Str;
printf(n[i]);
printf("\n");
}
printf("\\\\\\\\\\\\\\\\\\\n");

for (i=0;i<5;i++)
{
printf(n[i]);
printf("\n");
}
return 0;
}

输出的结果是:
0
1
2
3
4
\\\\\\\\\\\\\\\\\
4
4
4
4
4

为什么n[0],n[1],n[2],n[3]原来的值都变成了n[4]的值?谢谢!
...全文
149 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ENOUGH_XU 2006-03-24
  • 打赏
  • 举报
回复
你的Str的地址一直不变的,当最后一个是4,那么就覆盖了啊
duduhaha 2006-03-24
  • 打赏
  • 举报
回复
还是老毛病,看来你没理解楼上人所说的啊.给你改好了.
#include <stdio.h>
int main(int argc, char* argv[])
{
char *n[5];
char Str[5][20];
//char Str[20];
int i;



for (i=0;i<5;i++)
{
sprintf(Str[i],"%d",i);
n[i]=Str[i];
printf(n[i]);
printf("\n");
}

printf("\\\\\\\\\\\\\\\\\\\n");

for (i=0;i<5;i++)
{
printf(n[i]);
printf("\n");
}
return 0;
}
goodluckyxl 2006-03-24
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
char *n[5];
char Str[5][20];
int i;

for (i=0;i<5;i++)
{
sprintf(Str[i],"%d",i);
n[i]=Str[i];
printf(n[i]);
printf("\n");

}
printf("\\\\\\\\\\\\\\\\\\\n");

for (i=0;i<5;i++)
{
printf(n[i]);
printf("\n");
}
return 0;
}
goodluckyxl 2006-03-24
  • 打赏
  • 举报
回复
for (i=0;i<5;i++)
{
sprintf(Str,"%d",i);
n[i]=Str;
printf(n[i]);
printf("\n");
}
你怎么又重新对n[i]赋值了?
itlcx 2006-03-24
  • 打赏
  • 举报
回复
为什么结果还是和最初的一样。
不是我想要的结果
itlcx 2006-03-24
  • 打赏
  • 举报
回复
上面是大小写问题,现在改成这样:
int main(int argc, char* argv[])
{
char *n[5];
char Str0[20],Str1[20],Str2[20],Str3[20],Str4[20];
char Str[20];
int i;

//sprintf(Str0,"%d",0);
//sprintf(Str1,"%d",1);
//sprintf(Str2,"%d",2);
//sprintf(Str3,"%d",3);
//sprintf(Str4,"%d",4);
n[0]=Str0;
n[1]=Str1;
n[2]=Str2;
n[3]=Str3;
n[4]=Str4;

for (i=0;i<5;i++)
{
sprintf(Str,"%d",i);
n[i]=Str;
printf(n[i]);
printf("\n");
}

printf("\\\\\\\\\\\\\\\\\\\n");

for (i=0;i<5;i++)
{
printf(n[i]);
printf("\n");
}
return 0;
}
itlcx 2006-03-24
  • 打赏
  • 举报
回复
谢谢大家支持。

我想指针实现上面的功能,
所以想先给指给每个指针赋值:
char *n[5];
char Str0[20],Str1[20],Str2[20],Str3[20],Str4[20];

n[0]=str0;
n[1]=str1;
n[2]=str2;
n[3]=str3;
n[4]=str4;

无奈又提示下面错误:
E:\code\vc\test\test.cpp(42) : error C2065: 'str0' : undeclared identifier
E:\code\vc\test\test.cpp(42) : error C2440: '=' : cannot convert from 'int' to 'char *'

我该如何实现?谢谢
zoyar 2006-03-24
  • 打赏
  • 举报
回复
楼上的好严谨,佩服!
jinjiajie 2006-03-24
  • 打赏
  • 举报
回复
for (i=0;i<5;i++)
{
sprintf(Str,"%d",i);
n[i]=Str;
printf(n[i]);
printf("\n");
}

因为你n[i]只是个指针而已,他指向的是str的首地址,你的str每次都在变,第一次打印的是当时的值,而变到最后的值是4,因此你的n[0]到n[4]都指向了4,第2次打印的结果也成了4
zoyar 2006-03-24
  • 打赏
  • 举报
回复
程序中只有 char Str[20]; 一个实际的空间, char *n[5] 中5个指针最后都指向同一个地方了.
goodluckyxl 2006-03-24
  • 打赏
  • 举报
回复
并不是n[0],n[1],n[2],n[3]变成n[4]
而是*n[X]指向地址都是相同的
所以只要更改str数据*n[X]内容都会改变
要不你在这个函数里添点代码测试一下
int main(int argc, char* argv[])
{
char *n[5];
char Str[20];
int i;
int j = 0;
for (i=0;i<5;i++)
{
sprintf(Str,"%d",i);
n[i]=Str;
printf(n[i]);
printf("\n");
//测试代码
printf("i=%d前面的n[X]数据\n", i);
for( j = 0; j < i; j++ )
{
printf(n[j]);
printf(" ");
}
printf("\n");
printf("结束\n");
}
printf("\\\\\\\\\\\\\\\\\\\n");

for (i=0;i<5;i++)
{
printf(n[i]);
printf("\n");
}
return 0;
}
itlcx 2006-03-24
  • 打赏
  • 举报
回复
谢谢
goodluckyxl(被人遗忘的狗)
duduhaha(三人行必有我师)

谢谢大家

69,373

社区成员

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

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