当我的函数完成最后一个循环时,它会返回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);