我正在尝试编写一个函数,它接受列表大小和上限(对于随机数)并返回数组中的随机数。 这是我写的。
$result= json_decode($jSon);
var_dump($result); // to see the output
}
bool inList(long *heads, int num, int s){
for (int i=0; i<s; i++){
if (heads[i] == num){
return true;
}
}
return false;
}
long* generateRandomList(size_t s, int n){
long heads[s];
for (long i=0; i<s; i++){
heads[i] = -1;
}
srand(time(NULL));
for(int i=0; i<s; i++){
int r;
while (true){
r = ( rand() % n ) + 1;
bool isInList = inList(heads, r, s); // unique numbers
if (isInList == false){
break;
}
}
heads[i] = r;
printf("i %d r %d\n", i, r); // this is ok
}
return heads;
}
int main(){
size_t s = 20;
size_t n = 100;
long *lists;
lists = generateRandomList(s, n);
for (int i=0; i<s;i++){
printf("%d, %d\n",i, lists[i] );
}
内的第一个printf正常工作..
但是,第二个产生一些垃圾值..
这是示例输出。
generateRandomList()
答案 0 :(得分:3)
首先,我相信
printf("%d, %d\n",i, heads[i] );
应该阅读
printf("%d, %d\n",i, lists[i] );
这是此代码段中的拼写错误。
问题出现在您的代码中,首先, heads
数组是函数generateRandomList()
的本地数组。这就是为什么函数内的第一个printf()
通过访问heads
数组产生正确的输出。
一旦函数完成,你return
地址变量的地址,在返回后变为无效。因此,访问调用函数中返回的指针实质上是访问无效内存并调用undefined behaviour。这就是在第二次打印时打印垃圾值的原因。
解决方案:如果需要return
来自函数的指针并在调用者中使用它,则必须使用动态内存分配API(如malloc()
和family)定义指针并分配内存。
Knock Knock:别忘了free()
。
下一步,对格式sopecifier使用错误类型的参数也会调用UB。 %d
需要int
类型的参数,但您在那里传递long
。
解决方案:long
需要%ld
格式说明符与printf()
。
答案 1 :(得分:0)
您使用的动态数组没有干净的方式告诉您可能没有足够的内存(在这种情况下在堆栈上)。因此,您的程序偶尔会转储核心。
更重要的是,您从堆栈中不再存在的函数返回一个本地自动变量,这将被下一个函数调用覆盖。
避免使用动态数组,除非您知道stacksize足够的非常有限的情况。
如果要返回持久数组,请使用malloc()而不是动态数组。