尝试将新值传递给指针数组

时间:2017-11-05 20:59:10

标签: c arrays pointers pass-by-reference dynamic-memory-allocation

我试图创建一个函数,为三个指针数组中的每一个添加1个元素(firstArray,lastArray,scoreArray)。对于这个特定的任务,我应该使用指针和动态内存,但没有结构。

由于程序现在,它会自动移动到添加其他记录并等待用户输入的所有3个部分。但是,当程序在运行 addRecords()函数后调用 printRecords()函数时,会出现分段错误。我认为这意味着我没有将 addRecords()函数中所做的更改传递回main,因此没有任何内容存储在 printRecords()函数中正在努力阅读。我已经尝试了好几次但却无处可去。

如何更改 addRecords()中的3个问题行,以将对数组所做的更改传递回主数据?

enter image description here

void printRecords(char **firstArray, char **lastArray, float **scoreArray, int n);
void addRecords(char **firstArray, char **lastArray, float **scoreArray, int *j);

int main(int argc, char** argv) {

    int i = 0, n = 0;
    printf("Please indicate the number of student records to be entered:");
    scanf("%d",&n);

    char **firstArray;
    char **lastArray;
    float **scoreArray;

    firstArray = (char **)malloc(n*sizeof(char *));
    lastArray = (char **)malloc(n*sizeof(char *));
    scoreArray = (float **)malloc(n*sizeof(float *));

    for(i=0;i<n;i++)
    {
        printf("Enter Record %d:",i+1);
        firstArray[i] = (char *)malloc(n*sizeof(char));
        lastArray[i] = (char *)malloc(n*sizeof(char));
        scoreArray[i] = (float *)malloc(n*sizeof(float));
        scanf("%s",firstArray[i]);
        scanf("%s",lastArray[i]);
        scanf("%f",scoreArray[i]);
    }

    addRecords(firstArray,lastArray,scoreArray,&n);
    printRecords(firstArray,lastArray,scoreArray,n);

    return (EXIT_SUCCESS);
}

void printRecords(char **firstArray, char **lastArray, float **scoreArray, int n)
{
    int i = 0;
    printf("\nPrinting %d student records....\n",n);
    for(i=0;i<n;i++)
    {
        printf("Record %d: %s - %s - %.2f\n",i+1,firstArray[i],lastArray[i],*scoreArray[i]);
    }

}
void addRecords(char **firstArray, char **lastArray, float **scoreArray, int *j)
{

    int t = *j; //Assigning current number of records to temp variable
    t++;        //Increment by 1
    *j = t;     //Passes the new number of records back to main

    printf("Enter Record %d:",t);

    firstArray[t] = (char *)malloc(t*sizeof(char));
    lastArray[t] = (char *)malloc(t*sizeof(char));
    scoreArray[t] = (float *)malloc(t*sizeof(float));

    scanf("%s",firstArray[t]); **//PROBLEM LINES**

    scanf("%s",lastArray[t]); **//PROBLEM LINES**

    scanf("%f",scoreArray[t]); **//PROBLEM LINES**

    printf("\nNew record added successfully");
    return;

}

1 个答案:

答案 0 :(得分:0)

我认为你对字符串的内存分配非常困惑。你有两个层 - 指针数组和它们指向的实际字符串。您将在大小为n时分配一次数组。奇怪的是,字符串也分配大小n ??这些可能应该基于问题的某些参数。在addRecords中,然后根据当前记录数分配可变大小的添加字符串,但实际上并没有扩展指针数组。

最后,确保在读取记录时对字符串强制执行任何长度限制,这样就不会丢失内存。