我创建了一个结构和一个该类型的指针。我使用malloc为它分配内存,但当我试图实际为它分配一些值(特别是从文件中读取整数和浮点数)时,它会给我一个分段错误,说“在某个位置没有“ungetwc()可用的源”。
以下是有关指针和结构的部分代码:
typedef struct {
int *rain;
float *avgtemp;
float *avgwind;
} weather;
weather *year = (weather*) malloc(n*sizeof(weather));
if (year == NULL)
{
return 1;
}
for (i = 0; i!=12; i++)
{
fscanf(infile, "%i %f %f", (year+i)->rain, (year+i)->avgtemp, (year+i)->avgwind);
}
我想问题可能出在fscanf中的缺失,但是当我添加它时,IDE给了我一个警告,提示应该是int*,但是提供了int**。
最佳答案
根据您的代码,这是必需的:
typedef struct {
int *rain;
float *avgtemp;
float *avgwind;
} weather;
weather *years = malloc(n * sizeof(weather));
if (year == NULL) {
return 1;
}
weather *year = years;
for (i = 0; i < n; ++i, ++year) {
year->rain = malloc(sizeof(int));
year->avgtemp = malloc(sizeof(float));
year->avgwind = malloc(sizeof(float));
fscanf(infile, "%i %f %f",
year->rain, year->avgtemp, year->avgwind);
}
但是,我认为您真正想要的是不要在
struct
中使用指针:typedef struct {
int rain;
float avgtemp;
float avgwind;
} weather;
weather *years = malloc(n * sizeof(weather));
if (year == NULL) {
return 1;
}
weather *year = years;
for (i = 0; i < n; ++i, ++year) {
fscanf(infile, "%i %f %f",
&year->rain, &year->avgtemp, &year->avgwind);
}
更新:
是的,我刚从结构中删除了指针,它确实解决了我遇到的所有问题。也许我误解了教授的话。
也许 吧。第一种方法(即您的版本)对于某些更复杂的用例是有效的。例如,如果
struct
对于字符串有一个char *
,其中字符串长度可以任意长。第二个版本更习惯,更容易使用。
否则,在代码的其他地方,当访问一个元素时,我们将执行(例如)
int rain = *year->rain;
而不是[更简单的]int rain = year->rain;
如果其中一个
struct
成员需要一个值数组(例如),则结构用于年度报告,并且我们需要(例如)每个月的月降雨量(相对于该年的累积降雨量),则rain
可以[再次]是int *rain;
。但是,考虑到这一点,由于一年中的月数是固定的,我们可以做:int rain[12];
来保持简单性。