我的程序需要一个函数来查找数组中最大的元素。然后,它返回最大元素的位置。但是,在查找最大元素时,我只允许使用指针算法。
#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)
函数 main 中的错误:
您没有为阵列分配内存。您需要添加行array = (int*) malloc(sizeof(int) * size);
。没有这条线,你会得到segmentation fault
.
另一个错误是填充数组。数组已经是指针,因此您不必再次引用它。现在您正在更改指针,而不是数组值
潜在的错误:在循环中,当你填充数组时,你会增加指针,所以你会丢失有关数组开头的信息。您可以在循环执行array = array - size;
后再次获得它,但是如果您更早地断开循环,它将不起作用。最好使用临时指针。
函数中的错误最大:
您创建了未分配的指针count
,然后在循环初始化中将值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));
}