gpt4 book ai didi

c - 用随机数填充数组的程序中的内存错误

转载 作者:太空狗 更新时间:2023-10-29 15:39:59 25 4
gpt4 key购买 nike

我有一个程序可以创建一个数组并用随机数填充它。然后它检查是否有任何重复项并打印出每个重复项出现的次数。一切正常,除了 Memcheck 告诉我有 39 个错误,我无法弄清楚是什么导致了它们(我认为问题来自 repeated() 方法)?

干杯,哈利

代码-

#include <stdio.h>
#include <stdlib.h>
#include "random.h"

int main(void) {
int array_size = 0;
int *my_array;
int i = 0;

printf("Enter the size of the array:\n");
scanf("%d", &array_size);

my_array = malloc(array_size * sizeof my_array[0]);
if (NULL == my_array) {
fprintf(stderr, "memory allocation failed!\n");
return EXIT_FAILURE;
}

for (i = 0; i < array_size; i++) {
my_array[i] = rand() % array_size;
}
printf("What's in the array:\n");
for (i = 0; i < array_size; i++) {
printf("%d ", my_array[i]);
}
printf("\n");

repeated(my_array, array_size);

free(my_array);

return EXIT_SUCCESS;
}

void repeated(int *my_array, int array_size) {
int *array_tracker;
int i;

array_tracker = malloc(array_size * sizeof array_tracker[0]);

for (i = 0; i < array_size; i++) {
array_tracker[my_array[i]]++;
}

for (i = 0; i < array_size; i++) {
if (array_tracker[i] > 1) {
printf("%d occurs %d times\n", i, array_tracker[i]);
}
}

free(array_tracker);
}

内存检查输出-

==23999== Memcheck, a memory error detector
==23999== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==23999== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==23999== Command: ./lab20c-prog
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x40091F: repeated (random.c:15)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x519148A: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Use of uninitialised value of size 8
==23999== at 0x518DD8B: _itoa_word (in /usr/lib64/libc-2.24.so)
==23999== by 0x5192552: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x518DD95: _itoa_word (in /usr/lib64/libc-2.24.so)
==23999== by 0x5192552: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x5192669: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x5191536: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999== Conditional jump or move depends on uninitialised value(s)
==23999== at 0x51915B9: vfprintf (in /usr/lib64/libc-2.24.so)
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so)
==23999== by 0x40092E: repeated (random.c:16)
==23999== by 0x400799: main (random.c:42)
==23999==
==23999==
==23999== HEAP SUMMARY:
==23999== in use at exit: 0 bytes in 0 blocks
==23999== total heap usage: 4 allocs, 4 frees, 1,052,792 bytes allocated
==23999==
==23999== All heap blocks were freed -- no leaks are possible
==23999==
==23999== For counts of detected and suppressed errors, rerun with: -v
==23999== Use --track-origins=yes to see where uninitialised values come from
==23999== ERROR SUMMARY: 39 errors from 7 contexts (suppressed: 0 from 0)

最佳答案

您从未初始化array_tracker 的内容。所以当你这样做时:

array_tracker[my_array[i]]++;

您正在递增一个未初始化的值。这就是为什么您会收到很多关于使用未初始化值的投诉。

您可以使用 calloc() 而不是 malloc() 来分配空间并将所有元素初始化为 0

array_tracker = calloc(array_size, sizeof array_tracker[0]);

关于c - 用随机数填充数组的程序中的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46333276/

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