【问题标题】:Trying to pass new values to an array of pointers尝试将新值传递给指针数组
【发布时间】:2018-04-18 00:05:51
【问题描述】:

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

就像现在的程序一样,它会自动移动到添加额外的记录并等待用户输入的所有 3 个部分。但是,当程序在运行 addRecords() 函数后调用 printRecords() 函数时,出现分段错误。我认为这意味着我没有将 addRecords() 函数中所做的更改传递回主函数,因此 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, 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;

}

【问题讨论】:

  • 您对程序的输入是什么?您确定要使用n 作为您分配的字符串的大小吗?而且您不需要 scoreArray 成为数组数组。也许您应该退后几步,get a couple of good beginners books 重新开始?
  • 链接图像中的输入应该相当明显。如果没有,我可以在帖子中澄清。你是对的,我可以改变 scoreArray 的编写方式,但这不是我遇到的问题,因为它应该适合我的目的。
  • 你了解结构了吗?三个大小相同的数组听起来应该是一个包含三个元素的结构的数组。
  • 请不要链接图片。如果您无法将它们嵌入问题中,则将其重写为内部文本(始终首选问题正文中的文本)。
  • 另外,如果你输入2 对应n,那么想想你可以拥有多长的字符串(记住每个字符串都是null 终止)。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2013-02-15
    • 1970-01-01
    • 2012-01-24
    • 2012-10-28
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多