长阵列的打印元素会产生错误的输出,

时间:2015-09-07 06:51:40

标签: c arrays printf

我正在尝试编写一个函数,它接受列表大小和上限(对于随机数)并返回数组中的随机数。 这是我写的。

 $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()

2 个答案:

答案 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()而不是动态数组。