繁体   English   中英

使用Malloc分配内存(char和int)

[英]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的值可能应该以不同的方式计算,例如从051 如果您不使用存储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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM