Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么在声明整数指针p并将其分配给函数的返回值时会发生分段错误?_Arrays_C_Pointers_Gcc_Segmentation Fault - Fatal编程技术网

Arrays 为什么在声明整数指针p并将其分配给函数的返回值时会发生分段错误?

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

我的函数还返回一个整数指针。我的印象是数组名只是整数指针,所以我这样声明它。我制作了一个名为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 >= 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*