c语言 - 使用 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 %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" };

同时修复DiamondHeartsSpades上的拼写错误。事实上,除了Diamond之外,诉讼都是复数。

卡片的值可能应该以不同的方式计算,如从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 %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()

相关内容

  • 没有找到相关文章

最新更新