gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:12:49 25 4
gpt4 key购买 nike

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

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,然后是段错误(此输出指的是 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 = %d\n", result);
return 0;
}

您期望输出为result = 12。但你得到结果= 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;
}

关于c - 在 C 中索引数组会返回段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com