使用Malloc(char&;int)分配内存
我是使用Malloc(char&;int)分配内存,c,arrays,malloc,C,Arrays,Malloc,我是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
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]);
}
}
}
这应该是钻石,然后其余的是打印出来的罚款,1的心,2的心,等等和所有其他颜色
请您帮助我了解我在哪里犯了错误,以及我做错了什么?您将
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" };
同时修复菱形
、心形
和黑桃
上的打字错误。事实上,除了钻石之外,这些诉讼都是复数形式
卡的值可能应以不同的方式计算,如从0
到51
的数字。另外,如果您不使用卡,则应将其返回或释放。代码将按以下方式更改:
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计数(void){
int*cards=malloc(CardSize*sizeof(int));
int i,j,f;
const char*color[4]={“钻石”、“红心”、“黑桃”、“梅花”};
对于(i=0;i
这些额外的分配只用于锻炼,但是试试这个
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);
}
void count(){
int*卡;
int i,j,f;
const char*color_data[4]={“Diamon”、“Heart”、“Spade”、“Clubs”};
字符**颜色;
cards=malloc(CardSize*sizeof(int));
颜色=malloc(颜色*大小(字符*);
对于(i=0;i<4;i++){
颜色[i]=malloc((strlen(颜色数据[i])+1)*sizeof(字符));
strcpy(颜色[i],颜色数据[i]);
}
对于(f=0;f<4;f++){
对于(i=0;i<13;i++){
卡片[i]=(i%13)+1;
printf(“%d/s\n”,卡片[i],颜色[f]);
}
}
免费(卡);
对于(i=0;i<4;i++){
自由(颜色[i]);
}
免费(彩色);
}
注:
- 添加
#将包含到代码头,以使用strlen()
和strcpy()
- 此处省略,应检查
malloc()
的返回值是否为NULL
- 乘以
sizeof(char)
(=1)并不意味着什么,但我保留它是为了不丢失可读性
- 避免内存泄漏。对通过
malloc()
分配的内存使用free()
删除崩溃的行。旁白:虽然您还没有使用ACE
,但您可能应该删除在的末尾定义ACE 1代码>既然已经分配了字符串文本(指向第一个元素的指针),为什么还需要分配和分配另一个内存malloc()
不会初始化分配的内存,因此printf()
将打印randam数据,如果在无法读取之前没有终止空字符,则可能会导致分段错误。你想做什么?你期望什么代码>要做什么?您已经为颜色名称分配了内存。为什么要分配更多内存?特别是考虑到您的评论“我只是想具体存储必要的内存量。”谢谢您的回复!但是,我之所以想使用malloc,是因为我只想具体存储所需的内存量。顺便问一下,当我要洗牌时,我仍然可以使用count()函数中相同的变量吗?你是什么意思?到目前为止,您没有从count()
中带回任何变量。如果在count()
中实现shuffle,是的,可以使用这些变量,但是名称count
会让人困惑。但实际上,为什么要使用f=(i/13)%4,你不能跳过那一行吗?如果你用我的方式做,输出结果是一样的?谢谢你的回复!但是,我之所以想使用malloc,是因为我只想具体存储所需的内存量。顺便问一下,当我要洗牌时,我还能使用count()函数中相同的变量吗?@Williamhart:我应该写f=(i%52)/4代码>。我这样做的原因是,即使您处理的卡多于52张
卡,count
功能也可以工作。您的版本使用了隐含的假设,即CardSize==52
。如果出于某种原因修改#define
,代码将处理过多的卡并访问超出分配数量的内存,或者无法处理超过52张卡。隐含的假设,尤其是涉及显式常量的假设是不好的做法。它们通常会导致错误,尤其是在修改程序以扩展功能时。尽量避开它们。
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);
}