C-函数末尾的分割故障



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

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);
}

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

它返回segfault

中的数组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

似乎分割故障的原因是使用函数调用后传递给函数的参数。

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

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);

相关内容

  • 没有找到相关文章

最新更新