在C中生成随机数组时的SEGFULT和未初始化数据 #包括“stdafx.h” #包括 #包括 #定义len 10 int*随机数组(void); int main() { srand(时间(空)); int*rArray=(int*)malloc(sizeof(int)*len); rArray=randomArray(); 对于(int i=0;i

在C中生成随机数组时的SEGFULT和未初始化数据 #包括“stdafx.h” #包括 #包括 #定义len 10 int*随机数组(void); int main() { srand(时间(空)); int*rArray=(int*)malloc(sizeof(int)*len); rArray=randomArray(); 对于(int i=0;i,c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,任务是创建一个ints数组,并让函数用随机数填充该数组。函数randomArray()工作正常,但由于某种原因,赋值rArray=randomArray()不能正常工作,尽管rArray的某些元素是有效的数字,而不是乱码。另外,最后一条主线free(rArray)使程序崩溃,这对我来说是麻木的,没有任何意义。如果我删除该行,程序不会崩溃,但我们都知道需要free()amalloc()-ed数组 这里的主要问题是,array是randomArray()函数作用域中的一个局部变量。函数返回后,返回的

任务是创建一个
int
s数组,并让函数用随机数填充该数组。函数
randomArray()
工作正常,但由于某种原因,赋值
rArray=randomArray()
不能正常工作,尽管
rArray
的某些元素是有效的数字,而不是乱码。另外,最后一条主线
free(rArray)使程序崩溃,这对我来说是麻木的,没有任何意义。如果我删除该行,程序不会崩溃,但我们都知道需要
free()
a
malloc()
-ed数组

这里的主要问题是,
array
randomArray()
函数作用域中的一个局部变量。函数返回后,返回的地址将变为无效。任何进一步使用内存的尝试都将导致错误

此外,从您的方法来看,您试图通过函数调用返回的地址覆盖分配的内存,这将导致内存泄漏。相反,更改设计,将分配的内存作为参数传递给函数,然后使用
rand()
调用填充元素

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#define len 10

int *randomArray(void);

int main()
{
    srand(time(NULL));
    int *rArray = (int *)malloc(sizeof(int) * len);
    rArray = randomArray();
    for (int i = 0; i < len; i++) {
        printf("%d ", *(rArray+i));
    }
    puts("");
    free(rArray);
}

int *randomArray(void)
{
    int array[len] = { 0 };
    for (int i = 0; i < len; i++) {
        array[i] = rand() % len;
    }
    return array;
}
array
超出了
}
的范围,访问此返回指针是不正确的。
而且
rArray=randomArray()泄漏内存,因为现在无法释放malloc'd内存。您应该将
rArray
传递给负责归档的函数。

随机数组
返回指向本地数组
数组
的第一个元素的指针

当变量超出范围时,一旦函数返回,该指针立即失效。以任何方式使用它都会导致失败

更糟糕的是,您重新分配了指针
rArray
,使分配的原始内存丢失。这意味着您再次呼叫
free
将导致UB

要解决这两个问题,请将指针和大小作为参数传递给
randomArray
函数:

int *randomArray(void)
{
    int array[len] = { 0 };
    //...
    return array;
 }
void随机数组(int*array,int size)
{
对于(int i=0;i
在randomArray()函数中,返回在堆栈上分配的数组。从randomArray()函数返回时将释放该数组。相反,您可以这样做:

void randomArray(int *array, int size)
{
    for (int i = 0; i < size; ++i)
    {
        array[i] = rand() % size;
    }
}
void随机数组(int*array)
{
//删除此整数数组[len]={0};
对于(int i=0;i

并从main()调用randomArray(rArray)(

True),但在这种情况下,传递的大小将是多余的,因为它已经定义为宏。只是说。@SouravGhosh在将指针传递给“数组”时,传递其大小始终是一个好习惯。大小可能并不总是作为宏可用。:)
void randomArray(int * array)
{
    // Remove this int array[len] = { 0 };
    for (int i = 0; i < len; i++) {
        array[i] = rand() % len;
    }
    // Remove this .. return array;
}