[英]Allocating memory by using Malloc (char & int)
我是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 %s\n", 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
应该是钻石,然后其余的都很好地打印出来,一颗心,两颗心,等等,以及所有其他颜色。
请您能帮我了解我在哪里犯错,以及我在做什么错吗?
您将color
定义为4个指针的数组,这些指针指向正确初始化的char
数组:
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
外,这些西装都是复数的。
card的值可能应该以不同的方式计算,例如从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 %s\n", 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 %s\n", 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)没什么意义,但我保留它是为了不损失可读性。 free()
用于通过malloc()
分配的malloc()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.