Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_Indexing - Fatal编程技术网

在C中索引数组会返回分段错误

在C中索引数组会返回分段错误,c,arrays,indexing,C,Arrays,Indexing,我正在从事一个项目,该项目要求我将用户输入读取为整数对,然后将它们存储在数组中。因此,我创建了一个函数来实现这一点。但是,由于某种原因,每次输入最后一个输入时,我都会遇到分段错误。这是我的密码: int userInput(int *arrayPtr){ int numberPairs, i, numberElements; printf("%d", sizeof(int)); printf("How many pairs of integers? "); s

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

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;
}
目前,我主要尝试使for循环整体执行,但由于某些原因,它总是在最后一次迭代中分割错误。例如,如果对的输入为1 2、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);
}
您希望输出为
result=12
。但是您会得到
result=0
。原因是,当修改函数参数时,调用方的函数参数不会被修改,因为参数是按值传递的(这与C和大多数其他编程语言中的情况类似)。顺便说一句,如果你不是把一个变量作为第三个参数传递,而是把一个常量传递,那该怎么办:例如
Multiply(3,4,5)

如果希望函数修改参数,则必须将指向该参数的指针传递给函数,并修改函数中的指向值:

int main(){
    int *arrayPtr, numberPairs;
    numberPairs = userInput(arrayPtr);
    multiplyPairs(arrayPtr, numberPairs);
    free(arrayPtr);
}
以下示例显示了要执行的操作:

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 = %d\n", result);
    return 0;
}

是否将
int*
传递到此函数,然后期望它指向此函数分配的数组
arrayPtr=…
arrayPtr
与调用方传递的任何内容完全解耦。我不会用数组指针传递任何信息。我只是在我的主函数中声明它,以便它具有适当的范围。因为我使用与其他函数参数相同的arrayPtr。演示如何调用函数。请原谅我的严厉评论,但是如果代码是松弛的重新输出格式,其中数字被塞满了字符串,没有空格或换行符,那么代码的其余部分很可能也是松散的。请将
换行符
s放在打印语句的末尾,而不是前面。一个例子是循环最后一次迭代中
int
的输出,它直接运行到随后打印的
int
中。您如何知道哪些数字属于哪个
int
?您是否尝试过调试器?调试器==您的朋友。
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 = %d\n", result);
    return 0;
}