lif*_*ott 0 c malloc runtime-error
问题:我想为固定大小的字符串数组的元素分配内存,但是,我遇到崩溃的机会是75%。
那是我的程序完美运行的25%的时间,但是错误是我以前从未遇到过的错误
#define PACKAGE_COUNT 60
#define MAX_COUNT 5
const char *colors[] = { "blue", "red", "yellow", "purple", "orange" };
char **generatePackage() {
char **generatedPackage = malloc(PACKAGE_COUNT);
int randomIndex = 0;
for (int i = 0; i <= PACKAGE_COUNT; ++i) {
randomIndex = rand() / (RAND_MAX / MAX_COUNT + 1);
generatedPackage[i] = malloc(sizeof(char) * sizeof(colors[randomIndex]));
// ERROR
strcpy((generatedPackage[i]), colors[randomIndex]);
// printf("generatePackage - %d: %s \n", i + 1, generatedPackage[i]);
}
return generatedPackage;
}
Run Code Online (Sandbox Code Playgroud)
您没有考虑到指针的大小不是一个的事实。因此,仅分配了一部分大小。因此,某些指针没有足够的内存来分配,导致仅在访问其中一个指针时程序才会崩溃。
#define PACKAGE_COUNT 60
#define MAX_COUNT 5
const char *colors[] = { "blue", "red", "yellow", "purple", "orange" };
char **generatePackage() {
char **generatedPackage = malloc(PACKAGE_COUNT * sizeof(char*)); // The size of a pointer is not one, so this a multiplicative factor must be applied
int randomIndex = 0;
for (int i = 0; i < PACKAGE_COUNT; ++i) { // the upper bound is i < PACKAGE_COUNT, not i <= PACKAGE_COUNT
randomIndex = rand() / (RAND_MAX / MAX_COUNT + 1);
generatedPackage[i] = malloc(sizeof(char) * (strlen(colors[randomIndex]) + 1)); // You probably want to allocate enough space for the string, rather than enough space for the pointer, so you must use strlen
strcpy((generatedPackage[i]), colors[randomIndex]);
// printf("generatePackage - %d: %s \n", i + 1, generatedPackage[i]);
}
return generatedPackage;
}
Run Code Online (Sandbox Code Playgroud)