c/c++动态内存分配问题,问题在代码注释中

#include<stdio.h>#include<iostream>#include<string>#include<stdlib.h>#defineINCSIZE30... #include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#define INCSIZE 30
using namespace std;
struct Product
{
char num[5];
char name[10];
double price;
};
int main()
{
Product *product = new Product[30];//为什么这句话中的数字与前面定义的常量INCSIZE不一致就会输出乱码呢,
FILE *fp;
fp = fopen("d:\\1.txt", "r+");
int i = 0, memsize = INCSIZE;
while (!feof(fp))
{
fscanf(fp, "%s%s%lf", product[i].num,product[i].name,&product[i].price);
i++;
if (i >= memsize)
{
if (!feof(fp))
{
if ((product = (Product *)realloc(product, (memsize + INCSIZE) * sizeof(Product))) == 0)
{
printf("再分配空间失败!");
exit(0);
}
else
{
memsize += INCSIZE;
}
}
}
}
printf("编号\t名称\t价格\n");
for (int j = 0; j < i; j++)
{
printf("%s\t%s\t%lf\n", product[j].num, product[j].name, product[j].price);
}
return 0;
}

文件1.txt的内容

部分

3 io 2.5
4 po 2
5 lk 6.2
6 mk 3.5
7 uj 6.9
1 jk 8.6
2 kl 5
3 io 2.5
4 po 2
5 lk 6.2
6 mk 3.5
7 uj 6.9
1 jk 8.6
2 kl 5
3 io 2.5
4 po 2
5 lk 6.2
6 mk 3.5
7 uj 6.9
刚试了试,当Product *product = new Product[10]中的数字比INCSIZE小很多时,就会出现乱码,当相同或者差距不大时,输出看起来没啥问题
展开
 我来答
2008_shenao
2017-01-16 · TA获得超过555个赞
知道小有建树答主
回答量:306
采纳率:90%
帮助的人:102万
展开全部
这个程序是没有问题的,问题在于你的文件,你需要保证txt中最后一行不要有空行,就不会错了。出现乱码与数组大小无关,是你在控制文件中数据的时候,有的时候,末尾是空行,读入了错误的数据,当然会出问题,就会乱码了,有的时候,末尾没有空行,就不会乱码!你可以亲自试试这两种情况,就明白了!
追问
恩,像这样写确实没有问题,但是将INCSIZE 的大小改成比首次分配空间的数字大Product *product = new Product[30]
的时候,就会出现问题,你可以试一下,就是这里不知道为什么会出错,整个过程中,文件自始至终,我都没有动过。
追答
这个就是代码的问题了,你初始空间的大小设置错了,这里不应该这样 int i = 0, memsize = INCSIZE; 改成 int i = 0, memsize = 30; (memsize的值应该与Product *product = new Product[30]这个数组的长度相同)这样就对了。初始只有30个大小,当文件行数超过30的时候,系统就会在分配INCSIZE,如果还不够,就会继续分配INCSIZE。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式