gpt4 book ai didi

c - 打印长数组的元素会给出错误的输出,

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:40 25 4
gpt4 key购买 nike

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

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] );
}

generateRandomList() 中的第一个 printf 工作正常..但是,第二个产生一些垃圾值..这是示例输出。

// from printf inside generateRandomList function
i 0 r 16
i 1 r 4
i 2 r 11
i 3 r 20
i 4 r 5
i 5 r 14
i 6 r 3
i 7 r 6
i 8 r 17
// from second printf.
0, 16
1, 16
2, -712138747
3, 1
4, 5
5, 14
6, 3
7, 6
8, 17

最佳答案

首先,我相信

printf("%d, %d\n",i, heads[i] );

应该阅读

printf("%d, %d\n",i, lists[i] );

这是这个代码片段中的错字。


问题来了,在您的代码中,首先 heads 数组是函数generateRandomList() 的本地数组。这就是为什么函数中的第一个 printf() 通过访问 heads 数组产生正确的输出。

一旦函数结束,你返回局部变量的地址,返回后就失效了。因此,在调用函数中访问返回的指针本质上是访问无效内存并调用 undefined behaviour。 .这就是第二次打印时打印出垃圾值的原因。

解决方案:如果您需要从函数返回 一个指针并在调用者中使用它,您必须定义一个指针并使用动态内存分配API 分配内存,例如malloc()。和家人。

敲门声:别忘了 free() ,还有。

接下来,对格式说明符使用错误类型的参数也会调用 UB。 %d 需要一个类型为 int 的参数,但您在那里传递了一个 long

解决方案:long 需要 %ld 格式说明符与 printf()

关于c - 打印长数组的元素会给出错误的输出,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32432700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com