我遇到了一个很大的问题,我尝试用很多不同的方法解决这个问题,却找不到解决方法。
我必须做的是:
需要使用一个结构,组件将是:
指针(用于存储这两组元素);
我不知道为什么,但是当我执行程序(如下所示)时,第一组的第二个元素没有显示。如果你有时间,请帮助我找到问题所在。当一切看起来都很好的时候真的很令人沮丧,而且程序仍然没有用。非常感谢你 !!!
在 标题 中,我有:
#ifndef L8_3H_H_
#define L8_3H_H_
struct Set
{
unsigned int card;
double *p[2];
};
typedef struct Set MULTIME;
MULTIME *introduce_data();
void showSet(MULTIME *m, int j);
#endif /* L8_3H_H_ */
在 main 中,我有:
#include "L8_3h.h"
#include <stdio.h>
int main( void )
{
MULTIME *mult;
mult = introduce_data();
showSet(mult, 0);
showSet(mult, 1);
return 0;
}
我的 功能 是:
#include "L8_3h.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void showSet(MULTIME *m, int j)
{
int i;
if ( j == 0 )
{
printf("\nA = {");
}else
{
printf("\nB = {");
}
for (i = 0; i < (m + j)->card; ++i)
{
printf("%lf", *((m + j)->p[j]+i));
if (i != (m + j)->card - 1)
{
printf(", ");
}
}
printf("}");
}
MULTIME *introduce_data()
{
MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));
int i, j;
for (i = 0; i < 2; ++i)
{
printf("\nIntroduce the number of elements of set %d", i + 1);
scanf("%u", &(mult + i)->card);
(mult+i)->p[i] = (double*)malloc(sizeof(double)*((mult+i)->card));
printf("\nIntroduce the element of set %d\n", i+1);
for (j = 0; j < (mult + i)->card; ++j)
{
scanf("%lf", ((mult + i)->p[i]+j));
//It's interesting that when I put a printf right after introducing the
//element everything is fine(I get the right element)
}
}
printf("\nHeres the problem");
printf("\nThis should not be zero: %lf", *((mult + 0)->p[0]+1));
return mult;
}
答案 0 :(得分:1)
这似乎不对
struct Set
{
unsigned int card;
double *p[2];
};
你有一套有2个号码列表。我认为每个集合应该有一个列表
struct Set
{
unsigned int card;
double *p;
};
那里的事情变坏了。您需要创建2个Set实例并将数据加载到每个实例中。我将创建一个Load_Set函数,它接受一个双列表并返回一个新的malloced Set
答案 1 :(得分:1)
我可以快速查看introduce_data()
内的许多问题。
首先,转换malloc()
的返回值,如
MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));
是不必要的。移除(MULTIME *)
转换,并确保代码顶部有#include <stdlib.h>
。退出#include <stdlib.h>
并使用转换会导致代码具有未定义的行为。 (唯一的例外是如果你的C编译器实际上是一个C ++编译器 - 在这种情况下你需要#include <stdlib.h>
和转换。否则不要使用转换。)。
其次,malloc()
将mult
的内存分配为单个MULTIME
。然后循环使用mult
,就像它是两个MULTIME
的数组一样。这落后于(动态分配的数组)的末尾。行为未定义。
第三,您将获得数组语法和指针语法之间的映射错误。声明
(mult+i)->p[i] = (double*)malloc(sizeof(double)*((mult+i)->card));
功能相同(删除类型转换)到
mult[i].p[i] = malloc(sizeof(double)*(mult[i].card));
同样,声明
scanf("%lf", ((mult + i)->p[i]+j));
相当于
scanf("%lf", mult[i].p[i]+j);
这两个可能都不是你想要的。
潜在的问题是你没有正确理解指针如何与数组一起工作。你需要更仔细地阅读你的教科书。
答案 2 :(得分:0)
我希望对遇到同样问题的其他人有用。
最后,感谢彼得,我明白了问题所在。 Peter注意到我使用变量 mult 作为两个 MULTIME 元素的数组,而它被声明为单元素变量。
所以,改变之后:
MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));
到此:
MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME)*2);
我终于得到了正确的结果。