C 长数组的打印元素输出错误,
我试图写一个函数,它接受列表的大小和上限(对于随机数),并返回数组中的随机数。 这是我写的C 长数组的打印元素输出错误,,c,arrays,printf,C,Arrays,Printf,我试图写一个函数,它接受列表的大小和上限(对于随机数),并返回数组中的随机数。 这是我写的 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, in
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("%d, %d\n",i, heads[i] );
应该读
printf("%d, %d\n",i, lists[i] );
这是这个代码段中的一个输入错误
谈到问题,在代码中,首先,
heads
数组是函数generateRandomList()
的本地数组。这就是为什么函数中的第一个printf()
通过访问heads
数组来生成正确的输出
函数完成后,返回
局部变量的地址,该地址在返回后无效。因此,访问调用者函数中返回的指针实质上是访问无效内存并调用。这就是在第二次打印时打印垃圾值的原因
解决方案:如果需要从函数返回指针并在调用者中使用,则必须定义指针并使用动态内存分配API(如和系列)分配内存
敲门敲门:也别忘了
下一步,对格式sopecifier使用错误类型的参数也会调用UB%d
需要类型为int
的参数,但您在那里传递的是long
解决方案:long
首先需要有%ld
格式说明符和printf()
printf("%d, %d\n",i, heads[i] );
应该读
printf("%d, %d\n",i, lists[i] );
这是这个代码段中的一个输入错误
谈到问题,在代码中,首先,heads
数组是函数generateRandomList()
的本地数组。这就是为什么函数中的第一个printf()
通过访问heads
数组来生成正确的输出
函数完成后,返回
局部变量的地址,该地址在返回后无效。因此,访问调用者函数中返回的指针实质上是访问无效内存并调用。这就是在第二次打印时打印垃圾值的原因
解决方案:如果需要从函数返回指针并在调用者中使用,则必须定义指针并使用动态内存分配API(如和系列)分配内存
敲门敲门:也别忘了
下一步,对格式sopecifier使用错误类型的参数也会调用UB%d
需要类型为int
的参数,但您在那里传递的是long
解决方案:long
首先需要有%ld
格式说明符和printf()
printf("%d, %d\n",i, heads[i] );
应该读
printf("%d, %d\n",i, lists[i] );
这是这个代码段中的一个输入错误
谈到问题,在代码中,首先,heads
数组是函数generateRandomList()
的本地数组。这就是为什么函数中的第一个printf()
通过访问heads
数组来生成正确的输出
函数完成后,返回
局部变量的地址,该地址在返回后无效。因此,访问调用者函数中返回的指针实质上是访问无效内存并调用。这就是在第二次打印时打印垃圾值的原因
解决方案:如果需要从函数返回指针并在调用者中使用,则必须定义指针并使用动态内存分配API(如和系列)分配内存
敲门敲门:也别忘了
下一步,对格式sopecifier使用错误类型的参数也会调用UB%d
需要类型为int
的参数,但您在那里传递的是long
解决方案:long
首先需要有%ld
格式说明符和printf()
printf("%d, %d\n",i, heads[i] );
应该读
printf("%d, %d\n",i, lists[i] );
这是这个代码段中的一个输入错误
谈到问题,在代码中,首先,heads
数组是函数generateRandomList()
的本地数组。这就是为什么函数中的第一个printf()
通过访问heads
数组来生成正确的输出
函数完成后,返回
局部变量的地址,该地址在返回后无效。因此,访问调用者函数中返回的指针实质上是访问无效内存并调用。这就是在第二次打印时打印垃圾值的原因
解决方案:如果需要从函数返回指针并在调用者中使用,则必须定义指针并使用动态内存分配API(如和系列)分配内存
敲门敲门:也别忘了
下一步,对格式sopecifier使用错误类型的参数也会调用UB%d
需要类型为int
的参数,但您在那里传递的是long
解决方案:long
需要使用%ld
格式说明符和printf()。因此,您的程序偶尔可能会转储内核
更重要的是,从堆栈上不再存在的函数返回一个局部自动变量,该变量将被下一个函数调用覆盖
避免使用动态数组,除非在非常有限的情况下,您知道stacksize足够了
如果要返回持久数组,请使用malloc()而不是动态数组。您使用的动态数组没有干净的w