【问题标题】:Unable to shuffle cards randomly无法随机洗牌
【发布时间】:2016-04-26 07:11:49
【问题描述】:

我正在做一个随机洗牌 10 张牌 (12) 时间的项目,但它不适用于我的代码。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void show(int[],int);

void shuffle(int[],int,int);

int main (void)
{
    int karten[]={1,2,3,4,5,6,7,8,9,10};
    int n = sizeof(karten)/sizeof(int);
    //printf("%d",n);
    int s=12;

    srand(time(NULL));
    printf("Karten vor dem Mischen: \n");
    show(karten,n);
    shuffle(karten,n,s);
    printf("Karten nach dem Mischen:\n");
    show(karten,n);
    return 0;
}
void show(int karten[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%d,",karten[i]);
    }
    printf("\n");
}
void shuffle(int karten[],int n,int s)
{
    int i=0;
    int d=0;
    int v[]={(int)malloc(sizeof(karten))};
    for(int z=0;z<=s;z++)
    {
        i=rand()%10;
        d=rand()%10;
        //printf("%d-->%d\n",i,d);
        v[i]=karten[i];
        v[d]=karten[d];
        karten[d]=v[i];
        karten[i]=v[d];

    }
    printf("Es wurden %d Vertauschungen gemacht\n",s);
    free(v);
}

错误是

(((process returned 255))) 

程序崩溃了。

【问题讨论】:

    标签: c random malloc shuffle srand


    【解决方案1】:

    sizeof(karten)不要给你数组的长度,见sizeof array clarification。只需像这样重写代码(不需要另一个数组):

    void shuffle(int karten[],int n,int s)
    {
        int i=0, vi;
        int d=0, vd;
        for(int z=0;z<=s;z++)
        {
            i=rand()%10;
            d=rand()%10;
            vi=karten[i];
            vd=karten[d];
            karten[d]=vi;
            karten[i]=vd;   
        }
        printf("Es wurden %d Vertauschungen gemacht\n",s);
    }
    

    【讨论】:

    • 我认为你应该解释一下为什么。毕竟 sizeof(karten) in main 是有效的,因此可能会令人困惑。
    【解决方案2】:

    void shuffle(int karten[],int n,int s) 等价于
    void shuffle(int *karten,int n,int s)
    所以int v[]={(int)malloc(sizeof(karten))}; 只分配karten 的大小
    这是一个指向 int 的指针,所以 4 个字节(在大多数系统上)。
    因此,您正在尝试访问未分配的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多