[英]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.