对C中的数组进行索引会返回Segmentation Fault



我正在处理一个项目,该项目要求我将用户输入读取为整数对,然后将它们存储在数组中。所以,我创建了一个函数来实现这一点。然而,由于某种原因,每次输入最后一个输入时,我都会出现分段错误。这是我的代码:

int userInput(int *arrayPtr){
    int numberPairs, i, numberElements;
    printf("%d", sizeof(int));
    printf("How many pairs of integers? ");
    scanf("%d", &numberPairs);
    numberElements = numberPairs*2;
    arrayPtr = malloc((numberElements*sizeof(int)) + 64);
    for(i = 0; i < numberElements; i+=2){
        int first,second;
        printf("nEnter pair: ");
        printf("Before scanf");
        scanf("%d %d", &first, &second);
        printf("%d", first);
        arrayPtr[i] = first;
        arrayPtr[i+1] = second;
    }   
    printf("%d", numberPairs);
    return numberPairs;
}

以下是我如何调用函数:

int main(){
    int *arrayPtr, numberPairs;
    numberPairs = userInput(arrayPtr);
    multiplyPairs(arrayPtr, numberPairs);
    free(arrayPtr);
}

目前,我主要是想让for循环完整地执行,但由于某种原因,它总是在最后一次迭代时出错。例如,如果对的输入是12、3 4、5 6,则输出将是1 3,然后是seg错误(此输出指的是For循环中的print语句)。我花了几个小时试着调试这个代码,也让其他学生查看它,但我不知道出了什么问题。如果你能给我指明正确的方向,我将不胜感激。谢谢。

更新:我将代码复制并粘贴到一个新文件中,它按预期工作。感谢所有告诉我代码中其他错误元素的人。

您需要这个:

int userInput(int **arrayPtr){
    int numberPairs, i, numberElements;
    printf("%d", sizeof(int));
    printf("How many pairs of integers? ");
    scanf("%d", &numberPairs);
    numberElements = numberPairs*2;
    *arrayPtr = malloc((numberElements*sizeof(int)) + 64);
    for(i = 0; i < numberElements; i+=2){
        int first,second;
        printf("nEnter pair: ");
        printf("Before scanf");
        scanf("%d %d", &first, &second);
        printf("%d", first);
        (*arrayPtr)[i] = first;
        (*arrayPtr)[i+1] = second;
    }   
    printf("%d", numberPairs);
    return numberPairs;
}

int main(){
    int *arrayPtr, numberPairs;
    numberPairs = userInput(&arrayPtr);
    multiplyPairs(arrayPtr, numberPairs);
    free(arrayPtr);
}

使用一个非常简单的示例进行解释

您想要编写一个函数,将第一个参数与第二个参数相乘,并将值存储在第三个参数中。

所以你试试这个:

void Multiply(int a, int b, int r)
{
  r = a * b;
}
int main(){
    int result = 0;
    Multiply(3, 4, result);
    printf ("result = %dn", result);
    return 0;
}

您期望输出为result = 12。但你得到了result = 0。原因是当修改函数参数时,调用方的函数参数不会被修改,因为参数是按值传递的(这与C和大多数其他编程语言中的情况类似)。顺便问一下,如果你不把一个变量作为第三个参数,而是一个常量,会发生什么:例如Multiply(3, 4, 5);

如果你想让函数修改一个参数,你必须向函数的参数传递一个指针,并修改函数中的指向值:

以下示例显示了要做的操作:

void Multiply(int a, int b, int *r)
{
 // r points to the variable passed as third argument
  *r = a * b;
}
int main(){
    int result = 0;
    // here we pass the pointer to result
    Multiply(3, 4, &result);
    printf ("result = %dn", result);
    return 0;
}

最新更新