Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Malloc(char&;int)分配内存_C_Arrays_Malloc - Fatal编程技术网

使用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);
}