簡體   English   中英

為指向結構數組的指針分配內存

[英]allocate memory for pointer to array of structure

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "queue.h"
#include "stack.h"

#define RECORDS_SIZE 100
#define NAME_SIZE    20

typedef struct Student
{
    char nameStudent[NAME_SIZE];
    int  TimeIn;
    int  TimeUpdate;
}STUDENT;

typedef struct TUTOR
{
    char nameTutor[NAME_SIZE];
    int TutorTIme;
    STUDENT *ptr;
}TUTOR;


QUEUE *queue1;
STACK *stack1;

void getData(STUDENT *studentArr[RECORDS_SIZE]);

int main (void)
{

    STUDENT *studentArr[RECORDS_SIZE];
    FILE *fp = NULL;

    getData(studentArr);

    return 0;
} 

void getData(STUDENT *studentArr[RECORDS_SIZE])
{
    FILE *fp;
    char fileName[NAME_SIZE];
    char buffer[RECORDS_SIZE];
    int count = 0;

    printf("Enter file name: ");
    gets(fileName);
    fp = fopen(fileName, "r");
    if (fp == NULL)
    {
       printf("Error! The file does not exist!\n");
    }

    fgets(buffer, RECORDS_SIZE, fp);
    *studentArr = (STUDENT*) malloc(buffer[0]*sizeof(STUDENT));
    while (fgets(buffer, RECORDS_SIZE, fp) != NULL)
    {
        printf("%s", buffer[count]);
       *studentArr[count]->nameStudent = (char*) malloc(strlen(buffer)*sizeof(char));
        studentArr[count]->TimeIn = (int) malloc(strlen(buffer)*sizeof(int));
        sscanf(buffer,"%[,],%d", *studentArr[count]->nameStudent, &studentArr[count]->TimeIn);

        printf("%s%d\n", studentArr[count]->nameStudent, &studentArr[count]->TimeIn);
       count++;
    }

    return;
}

有警告,該賦值是從指針中獲取整數而沒有強制轉換[默認啟用] | 在為* studentArr [count]-> nameStudent分配內存的行上,為什么會收到此警告?

這是我的文件的樣子

4
A,10
B,12
C,60
D,120
tutorY

我嘗試在第一行中讀取,然后使用第一行中的數字將指針分配給結構數組並繼續讀取,然后分配結構的其余成員

我認為我在while循環中做錯了,可能是因為我不應該調用fgets,然后在while循環中重用它,因為它在那里似乎有錯誤。 如何修復此功能?

預先感謝

修訂的問題

nameStudent是一個20個字符的數組,我認為這可能在分配時引起問題。

在這種情況下,您根本不需要動態分配nameStudent字段。 創建學生結構時,名稱的所有空間都將分配為學生結構的一部分。


較早的觀察

如果您確實有:

*studentArr[count]->nameStudent = (char*) malloc(strlen(buffer)*sizeof(char));

然后輸入合理的nameStudent類型

 struct Xxxx
 {
     ...
     char *nameStudent;
     ...
 };

您在前面有* ,它取消引用了指向char的未定義指針。 這就是為什么您收到警告:

 assignment makes integer from pointer without a cast [enabled by default]

具有固定大小的學生姓名的結構可能會更好地為您服務:

 struct Xxxx
 {
     ...
     char nameStudent[32];
     ...
 };

*studentArr[count]->nameStudent = (char*)...

盡管您尚未提供STUDENT的定義,但這肯定是錯誤的...如果nameStudent為char* ,則嘗試通過該初始*將其存儲到其第一個字節中。 您的代碼還有其他錯誤,例如下一行的(int)強制轉換。 我建議您更多地研究C語言,並更加注意程序是否以及如何滿足其要求。 C要求很高的精度。

更新:

由於nameStudent是一個數組,因此不能也不應為其分配指針。

您的代碼也包含許多其他錯誤。

fgets(buffer, RECORDS_SIZE, fp); 

這將讀取RECORDS_SIZE個字節,而不是一個STUDENT記錄。

*studentArr = (STUDENT*) malloc(buffer[0]*sizeof(STUDENT));

buffer[0]在這里沒有意義。 只設置studentArr的第一個元素沒有任何意義..您無需在循環中設置任何其他元素。 循環外不應存在fgets調用...永遠不會檢查錯誤或EOF的調用。

您的程序包含太多錯誤和誤解,無法在不為您編寫代碼的情況下回答您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM