Arrays 为什么在声明整数指针p并将其分配给函数的返回值时会发生分段错误?
我的函数还返回一个整数指针。我的印象是数组名只是整数指针,所以我这样声明它。我制作了一个名为reverse()的函数来反转指针,当我在我的Ubuntu18.04和gcc版本7.5上运行它时,我得到了一个分段错误。这是为什么?正确且最有效的代码是什么Arrays 为什么在声明整数指针p并将其分配给函数的返回值时会发生分段错误?,arrays,c,pointers,gcc,segmentation-fault,Arrays,C,Pointers,Gcc,Segmentation Fault,我的函数还返回一个整数指针。我的印象是数组名只是整数指针,所以我这样声明它。我制作了一个名为reverse()的函数来反转指针,当我在我的Ubuntu18.04和gcc版本7.5上运行它时,我得到了一个分段错误。这是为什么?正确且最有效的代码是什么 #include <stdio.h> int * reverse(int * array, int n){ int * rev; int i = n - 1; int j = 0; while(i &g
#include <stdio.h>
int * reverse(int * array, int n){
int * rev;
int i = n - 1;
int j = 0;
while(i >= 0){
rev[j] = array[i];
j++;
i--;
}
return rev;
}
int main(){
int array[] = {1,2,3,4};
int * p; //the pointer p that im declaring
p = reverse(array, 4); //i think this is the segmentation error
int i = 0;
printf("the first element is %d", p[0]);
}
#包括
int*反向(int*数组,int n){
国际*修订版;
int i=n-1;
int j=0;
而(i>=0){
rev[j]=数组[i];
j++;
我--;
}
返回版本;
}
int main(){
int数组[]={1,2,3,4};
int*p;//我声明的指针p
p=reverse(数组,4);//我认为这是分段错误
int i=0;
printf(“第一个元素是%d”,p[0]);
}
“我制作了一个名为reverse()的函数来反转指针,当我在我的Ubuntu18.04和gcc版本7.5上运行它时,我得到一个分段错误内核转储。这是为什么?”
reverse
中的指针rev
不指向任何内存。在取消引用rev
之前,需要分配n*sizeof(int)
的内存,并将rev
分配到该点。否则,访问未分配内存时会出现未定义的行为
int * rev = malloc( n * sizeof(int) );
if (!rev)
{
perror("malloc");
// error routine.
}
int*rev;rev[j]=数组[i]代码>是未定义的行为,因为rev
是未初始化的指针。激活编译器警告。使用-Wall-Wextra
,他们会解释问题的哦,是的,谢谢大家!顺便说一句,找出这种情况下发生的情况的最有效方法是使用调试器。学习如何使用它,它将为您节省无数的时间。”u我的印象是数组名只是整数指针。这种印象是错误的。数组名在某些情况下会衰减为指针,比如传递给函数时,但它们是完全不同的东西。数组名称具有大小信息,而指针则会丢失它们。当然,如果元素是另一种类型,则它不会是int[]
或int*
。