我的程序需要有一个函数,在其中找到数组的最大元素。然后它返回最大元素的位置。但是,当找到最大的元素时,我只允许使用指针算法。
#include <stdio.h>
int *largest(int *array, int size){
int *p1 = array;
int *count, max = *p1;
for(*count = 0; count < p1 + size - 1; p1++){
if (max < *p1){
max = *p1;
count++;
}
}
return count;
}
int main(void){
int *array, size = 10;
printf("enter elements; ");
for(int i = 0; i < size; i++){
scanf("%d ", &array);
array++;
}
printf("\nThe largest element in the array is in element %d", *largest(array, size));
}
但是,当我运行程序时,输入元素的值后,它会给我:
segmentation fault (core dumped)
答案 0 :(得分:1)
函数main中的错误:
您没有为阵列分配内存。您需要添加第array = (int*) malloc(sizeof(int) * size);
行。 如果没有此行,您将获得segmentation fault
。
另一个错误是填充阵列。数组已经是指针,因此您不必再次引用它。 现在您要更改指针,而不是数组值
潜在错误:在填充数组的循环中,增加指针,因此您将丢失有关数组开头的信息。你可以在循环执行array = array - size;
之后再次获取它,但如果你先断开循环它就不会工作。最好使用临时指针。
函数中的错误最大:
您创建了指针count
,该指针未分配,然后在for循环初始化中将值0
写入未知地址。 导致segmentation fault
。
在for循环中,您尝试从地址 0 读取内存以寻址数组+大小 - 2 ,但是您想要从数组的开头到结尾读取它数组的数组,从数组到数组+大小 - 1 。
返回count
毫无意义,但总结一下,请看一下示例。
指针只是数字,它是内存的地址,所以当你不分配它或者不分配现有的指针时,它会随机指向内存,操作系统不允许你访问它记忆。你可能会从随机指针中读取一些内容,但是新的编译器会将初始值设置为0.在BSD中,你可以从地址0读取,但linux导致分段错误(我希望我没有切换它)。写入地址0会导致两个系统中的分段错误。
如果你有有效的指针,你也应该检查函数,并且分配可能会失败,所以你需要在分配后立即检查指针。总结一下:永远不要相信指针,总是检查它的有效性。
示例不会检查指针的有效性。
#include <stdio.h>
int *largest(int *array, int size){
int *end = array + size; // address behind array
int *max = *array; // address with largest value
for(; array < end; ++array){ // you dont need initialization since the array points to beginning
if (*max < *array){ // compare values, not address
max = array; // save position of pointer with largest value
}
}
return max; // return address with largest value
}
int main(void){
int *array, size = 10;
array = (int*)malloc(sizeof(int) * size); // allocate memory
printf("enter elements; ");
int *tmp = array; // temporary variable to not loose information about beginning of array
for(int i = 0; i < size; i++){
scanf("%d ", tmp); // reference is not needed since tmp is already pointer to value
tmp++;
}
printf("\nThe largest element in the array is in element %d", *largest(array, size));
}