【问题标题】:Indexing an array in C returns a Segmentation Fault在 C 中对数组进行索引会返回分段错误
【发布时间】:2016-04-04 16:32:01
【问题描述】:

我正在做一个项目,该项目需要我将用户输入读取为整数对,然后将它们存储在一个数组中。因此,我创建了一个执行此操作的函数。但是,由于某种原因,每次输入最后一个输入时,我都会遇到分段错误。这是我的代码:

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 循环完整执行,但由于某种原因,它总是在最后一次迭代中出现段错误。例如,如果我对这些对的输入是 1 2、3 4、5 6,我的输出将是 1 3,然后是一个 seg 错误(这个输出是指 for 循环中的 print 语句)。我花了几个小时试图调试这段代码以及让其他学生查看它,但我无法弄清楚哪里出了问题。如果你能指出我正确的方向,我将不胜感激。谢谢。

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

【问题讨论】:

  • 您是否将int * 传递给此函数,然后期望它指向此函数分配的数组? arrayPtr = ...arrayPtr 与调用者传递的任何内容完全分离。
  • 我没有通过数组指针传递任何信息。我只是在我的 main 函数中声明它,以便它具有适当的范围。因为我使用相同的arrayPtr作为其他函数的参数。
  • 显示你如何调用函数。 Read this.
  • 请原谅我的严厉评论,但是如果代码是松弛的重新输出格式,其中数字被塞到没有空格或换行符的字符串中,那么其余的代码可能同样马虎。请将newlines 放在打印语句的末尾,而不是之前。一个例子是循环最后一次迭代中int 的输出,该循环直接运行到之后打印的int。你怎么知道哪个数字属于哪个int
  • 你试过调试器吗?调试器 == 你的朋友。

标签: c arrays indexing


【解决方案1】:

你需要这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 2020-08-29
    • 2018-04-08
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多