[英]how to dynamically allocate memory for a struct type array in C
所以我有一个程序,我需要读取一个文件并将其中的一些单词存储在一个数组中,但我想这样做,以便在我存储各个单词的每个数组中,根据我有多少单词来自定义大小有
typedef struct {
char* keyword;
int keywordCount;
int stdev;
} keywordData;
int keywordNumber;
keywordData* keyword;
void fetchKeywords(const char* filename)
{
FILE* keywords = fopen(filename, "r");
// first number in the file is the number of keywords in the file, so i dont need to count them
fscanf(keywords,"%d", &keywordNumber);
keyword = (keywordData *) malloc(keywordNumber * sizeof(keywordData));
for(int i = 0; i < keywordNumber; i++)
{
fscanf(keywords,"%s", keyword[i].keyword);
//printf("%s\n", keyword[i].keyword);
}
}
您的代码无效,因为您没有为keyword
分配 memory 并且您将字符串扫描到其中。 它调用未定义的行为 UB。
尽量不要使用全局变量。 使用 function 返回值和指针参数(如果需要)。
#define MAXKEYWORDLENGTH 64
typedef struct {
char keyword[MAXKEYWORDLENGTH];
int keywordCount;
int stdev;
} keywordData;
keywordData *fetchKeywords(const char* filename, int *keywordNumber)
{
FILE* keywords = fopen(filename, "r");
keywordData *kd;
// first number in the file is the number of keywords in the file, so i dont need to count them
if(keywords)
if(fscanf(keywords,"%d", keywordNumber) != 1) { /* error handling*/}
kd = malloc(*keywordNumber * sizeof(*kd));
if(kd)
for(int i = 0; i < keywordNumber; i++)
{
fscanf(keywords,"%s", kd[i].keyword);
//printf("%s\n", keyword[i].keyword);
}
if(keywords) fclose(keywords);
return kd;
}
我没有足够的代表发表评论,但是您收到其他答案代码的警告是因为keywordNumber
是一个int *
而i
只是一个int
,所以您需要在 for 循环中首先取消引用keywordNumber
(所以for (int i = 0; i < *keywordNumber; i++)
); 这段代码应该修复它:
#define MAXKEYWORDLENGTH 64
typedef struct {
char keyword[MAXKEYWORDLENGTH];
int keywordCount;
int stdev;
} keywordData;
keywordData *fetchKeywords(const char* filename, int *keywordNumber)
{
FILE* keywords = fopen(filename, "r");
keywordData *kd;
// first number in the file is the number of keywords in the file, so i dont need to count them
if(keywords)
if(fscanf(keywords,"%d", keywordNumber) != 1) { /* error handling*/}
kd = malloc(*keywordNumber * sizeof(*kd));
if(kd)
for(int i = 0; i < *keywordNumber; i++)
{
fscanf(keywords,"%s", kd[i].keyword);
//printf("%s\n", keyword[i].keyword);
}
if(keywords) fclose(keywords);
return kd;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.