我是C
的新手,我正在努力理解malloc
。我正在尝试创建一个程序,为卡片/颜色分配内存并打印出来。
我做了一个看起来像这样的函数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ACE 1;
#define CardSize 52
#define colors 4
int main() {
count();
system("pause");
return 0;
}
void count() {
int *cards;
int i, j, f;
char *color[4] = { "Diamond", "Heart", "Spade", "Clubs"};
cards = malloc(CardSize * sizeof(int));
*color = malloc(colors * sizeof(char)); //Here's where my program crashes
for (f = 0; f < 4; f++) {
for (i = 0; i < 13; i++) {
cards[i] = (i % 13) + 1;
printf("%d of %sn", cards[i], color[f]);
}
}
}
没有*color = malloc(colors*sizeof(char));
行,程序运行良好,但我想为我的颜色分配内存。
输出是这样的:
1 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
2 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
3 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
4 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
5 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
6 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
7 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
8 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
9 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
10 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
11 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
12 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
13 of ════════════════════════════════════════════════════²²²²╬─Ép┐p
应该是钻石,然后其余的都印出来了,1颗红心,2颗红心等所有其他颜色。
请你帮我理解我在哪里犯了错误,我做错了什么?
您将color
定义为指向正确初始化的char
数组的4个指针的数组:
char *color[4] = { "Diamon", "Heart", "Spade", "Clubs"};
但是您立即在这个数组的第一个元素中存储另一个指针:
*color = malloc(colors*sizeof(char)); //Here's where my program crashes
你根本不应该那样做。我真的不理解你这样做的意图,但只要去掉这一行,你的程序就会正常运行。请注意,字符串文字存储在只读存储器中,因此color
实际上应该定义为:
const char *color[4] = { "Diamon", "Heart", "Spade", "Clubs" };
同时修复Diamond
、Hearts
和Spades
上的拼写错误。事实上,除了Diamond
之外,诉讼都是复数。
卡片的值可能应该以不同的方式计算,如从0
到51
的数字。如果你不使用cards
,它也应该被返回或释放
void count(void) {
int *cards = malloc(CardSize * sizeof(int));
int i, j, f;
const char *color[4] = { "Diamond", "Hearts", "Spades", "Clubs" };
for (i = 0; i < CardSize; i++) {
j = (i % 13) + 1; // Card value
f = (i / 13) % 4; // color number 0 to 3
cards[i] = i % 52;
printf("%d of %sn", j, color[f]);
}
free(cards);
}
这些额外的分配只用于锻炼,但请尝试一下。
void count() {
int *cards;
int i, j, f;
const char *color_data[4] = { "Diamon", "Heart", "Spade", "Clubs"};
char **color;
cards = malloc(CardSize*sizeof(int));
color = malloc(colors*sizeof(char*));
for (i = 0; i < 4; i++) {
color[i] = malloc((strlen(color_data[i]) + 1)*sizeof(char));
strcpy(color[i], color_data[i]);
}
for (f = 0; f < 4; f++) {
for (i = 0; i < 13; i++) {
cards[i] = (i % 13) + 1;
printf("%d of %sn", cards[i], color[f]);
}
}
free(cards);
for (i = 0; i < 4; i++) {
free(color[i]);
}
free(color);
}
注:
- 将
#include <string.h>
添加到代码的头部以使用strlen()
和strcpy()
- 此处省略,应检查
malloc()
的返回值是否为NULL
- 乘以
sizeof(char)
(=1)毫无意义,但我保留了它,以免失去可读性 - 避免内存泄漏。对于通过
malloc()
分配的存储器,请使用free()