功能结束时的分段错误

时间:2018-04-01 18:11:49

标签: c arrays segmentation-fault free dynamic-arrays

当我的函数完成最后一个for循环时,它返回一个段错误。我不知道为什么。这是我的代码。

void initArray(int a[], int n){
    int i, j;
    a = (int *) malloc(n * sizeof(int));
    for(i = 0; i < n; i++){
        a[i] = i+1;
    }
    for(j = n-1; j >= 0; j--){
        int num1 = rand() % (j+1); // generates a random number from 0 to n
        int container2 = a[j];
        a[j] = a[num1];
    a[num1] = container2;
    }
    // Array checking purposes
    int k;
    for(k = 0; k < n; k++){
        printf("%i ", a[k]);
    }
    printf("\n");
    free(a);
}

应该创建一个动态数组,然后随机化数组中的数字。我究竟做错了什么? 感谢。

2 个答案:

答案 0 :(得分:0)

  

返回段错误

中的数组int a[]
void initArray(int a[], int n){

不能在函数initArray之外使用。创建的内存被free(a);

破坏

将其更改为:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int * initArray(int n){
    int i, j;

    int *a =  malloc(n * sizeof(int));
    for(i = 0; i < n; i++){
        a[i] = i+1;
    }
    for(j = n-1; j >= 0; j--){

        int num1 = rand() % (j+1); // generates a random number from 0 to n
        int container2 = a[j];

        a[j] = a[num1];

        a[num1] = container2;
    }

    printf("\n");
    return a;  
} 

int main(void)
{
    int *a;
    int k;
    int n = 5;

    a = initArray(n);

    // Array checking purposes
    for(k = 0; k < n; k++){
        printf("%i ", a[k]);
    }

    free(a);
    return 0;   
}

输出:

5 2 1 3 4

答案 1 :(得分:-1)

分段错误的原因似乎是在调用者函数调用之后使用传递给函数的参数。

该函数没有意义,因为它的第一个参数的值未被使用,并且在函数的开头被覆盖

void initArray(int a[], int n){
    int i, j;
    a = (int *) malloc(n * sizeof(int));
    //...

考虑到传递给函数的原始参数没有改变,因为函数处理函数参数值的副本。

使用free

free(a);

与函数名称相矛盾。

似乎你需要声明像

这样的函数
void initArray(int **a, int n){
    //...
    *a = (int *) malloc(n * sizeof(int));
    for( int i = 0; i < n; i++){
        ( *a )[i] = i+1;
    }
    //...

您需要删除free

的来电

似乎你应该写

int num1 = rand() % n;

而不是

int num1 = rand() % (j+1);