Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试将新值传递给指针数组_C_Arrays_Pointers_Pass By Reference_Dynamic Memory Allocation - Fatal编程技术网

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

C 尝试将新值传递给指针数组,c,arrays,pointers,pass-by-reference,dynamic-memory-allocation,C,Arrays,Pointers,Pass By Reference,Dynamic Memory Allocation,我试图创建一个函数,用于向三个指针数组(firstArray、lastArray、scoreArray)中的每一个添加1个元素。对于这个特殊的赋值,我应该使用指针和动态内存,但不使用结构 正如程序现在所做的那样,它会自动移动到添加一条附加记录,并等待用户输入的所有3部分。但是,当程序在运行addRecords()函数后调用printRecords()函数时,我得到了一个分段错误。我假设这意味着我没有将在addRecords()函数中所做的更改传递回main,因此,printRecords()函数

我试图创建一个函数,用于向三个指针数组(firstArray、lastArray、scoreArray)中的每一个添加1个元素。对于这个特殊的赋值,我应该使用指针和动态内存,但不使用结构

正如程序现在所做的那样,它会自动移动到添加一条附加记录,并等待用户输入的所有3部分。但是,当程序在运行addRecords()函数后调用printRecords()函数时,我得到了一个分段错误。我假设这意味着我没有将在addRecords()函数中所做的更改传递回main,因此,printRecords()函数试图读取的地方没有存储任何内容。我试了好几次,但一无所获

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

void printRecords(char**firstArray,char**lastArray,float**scoreArray,int n);
void addRecords(char**firstArray,char**lastArray,float**scoreArray,int*j);
int main(int argc,字符**argv){
int i=0,n=0;
printf(“请注明要输入的学生记录数:”);
scanf(“%d”和“&n”);
字符数组;
字符数组;
浮点数组;
firstArray=(char**)malloc(n*sizeof(char*);
lastArray=(char**)malloc(n*sizeof(char*);
scoreArray=(float**)malloc(n*sizeof(float*);

对于(i=0;i我认为您对字符串的内存分配非常混乱。您有两层-指针数组和它们所指向的实际字符串。您以大小n分配数组一次。奇怪的是,字符串也以大小n分配??这些可能是基于问题的某个参数。在addRecords中,您然后都可以根据当前记录数以可变大小分配添加的字符串,但实际上并不扩展指针数组


最后,请确保在读取记录时对字符串执行任何长度限制,以免损坏内存。

您对程序的输入是什么?您确定要使用
n
作为分配字符串的大小吗?并且您不需要
scoreArray
作为数组数组。也许您应该采取一些措施退一步,然后重新开始?从链接的图像中,输入应该相当明显。如果没有,我可以在帖子中澄清。你是对的,我可以更改scoreArray的编写方式,但这不是我的问题,就我的目的而言,这应该没问题。你已经了解了结构吗?三个大小相同的数组听起来很简单例如,它应该是一个包含三个元素的结构数组。请不要链接图像。如果您无法将它们嵌入问题中,请将其重写为问题内部的文本(问题正文中的文本总是首选)。此外,如果您为
n
输入
2
,请考虑您可以拥有的字符串长度(记住每个字符串都以null结尾)。
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;